将<t>列为接口上的属性</t>

时间:2015-04-06 21:51:21

标签: c# .net generics interface

我正在尝试为Caching类创建一个接口,如下所示:

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的返回类型定义通用列表的方法。

实现目标的最佳方法是什么?我可以使用_dataData的通用返回类型,还是我应该使用的其他模式更优秀呢?

3 个答案:

答案 0 :(得分:4)

如果您使接口本身通用,则可以在接口上拥有通用属性:

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

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

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

注意:您不能在界面上拥有私人会员。这没有意义,因为界面只描述了外向合同。您可能希望使用抽象类。

答案 1 :(得分:1)

你必须使界面本身通用:

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

此外,界面不能拥有私人会员。

答案 2 :(得分:0)

你的代码将无法编译,这总是一个坏兆头:)

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

  1. 它不是线程安全的。
  2. 其用户可以修改缓存的值。
  3. 正如Scott Chamberlain建议的那样,请查看MemoryCache课程。