在界面上将 <T> 列为 属性

List<T> as a property on an interface

我正在尝试为缓存创建接口 class,如下所示:

public interface IDataCacheMember
{
    private List<T> _data;
    public List<T> Data;

    private void RefreshCache();
    private List<T> GetData();
}

public class StateMap : IDataCacheMember
{
    private List<States> _data;
    public List<States> Data 
    { 
        get
        {
            if (_data == null || _data.Count() < 1)
                _data = GetData();

            return _data;
        }
    }

    private void RefreshCache()
    {
        _data = GetData();
    }

    private List<States> GetData()
    {
        //API Magic to get states
    }

    private static readonly Lazy<StateMap> lazy =
        new Lazy<StateMap>(() => new StateMap());

    public static StateMap Instance { get { return lazy.Value; } }

    private StateMap()
    {
        //Set a timer to call RefreshCache() every five minutes
    }
}

目标是在网站的许多小型数据集上节省对 API 的调用。这些数据集不需要精确到最新。

没有空间使用适当的缓存服务(Redis 等)。

问题是我找不到为 _dataData.

的 return 类型定义通用列表的方法

实现我的目标的最佳方法是什么?我可以为 _dataData 使用通用的 return 类型吗?或者我应该使用另一种更好的模式吗?

您必须使界面本身通用:

public interface IDataCacheMember<T>
{
    List<T> Data { get; set; }
}

此外,接口不能有私有成员。

如果您将接口本身设为通用,则可以在接口上使用通用 属性:

public interface IDataCacheMember<T>
{
    List<T> Data { get; }
}

并将其与类型参数一起使用:

public class StateMap : IDataCacheMember<States>
{
    // ...
}

注意:接口上不能有私有成员。这没有意义,因为接口仅描述了向外合同。您可能想改用抽象 class。

您的代码无法编译,这总是一个不好的迹象:)

您的缓存有两个重要问题:

  1. 它不是线程安全的。
  2. 缓存的值可以由其用户修改。

正如 Scott Chamberlain 所建议的,请查阅 MemoryCache class。