【问题标题】:List<T> as a property on an interfaceList<T> 作为接口上的属性
【发布时间】:2015-04-06 21:51:21
【问题描述】:

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

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 提供一个通用的返回类型,还是我应该使用另一种更好的模式?

【问题讨论】:

  • 如果您使用的是 .NET 4.0 或更高版本,您可以使用内置的 MemoryCache 类,而无需依赖任何第三方缓存服务。您可以使用Add methods 轻松设置定时到期。

标签: c# .net generics interface


【解决方案1】:

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

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

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

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

注意:您不能在界面上拥有私有成员。这是没有意义的,因为接口只描述了一个外部合同。您可能想改用抽象类。

【讨论】:

  • 除非他像@Scott 建议的那样使用其他缓存策略,否则我肯定也建议使用抽象类,将尽可能多的可重用代码放在基类中。
【解决方案2】:

你必须使接口本身通用:

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

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

【讨论】:

  • 接口中不能有访问修饰符。
【解决方案3】:

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

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

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

正如 Scott Chamberlain 所建议的,请查看 MemoryCache 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2011-05-26
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多