在界面上将 <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 等)。
问题是我找不到为 _data
和 Data
.
的 return 类型定义通用列表的方法
实现我的目标的最佳方法是什么?我可以为 _data
和 Data
使用通用的 return 类型吗?或者我应该使用另一种更好的模式吗?
您必须使界面本身通用:
public interface IDataCacheMember<T>
{
List<T> Data { get; set; }
}
此外,接口不能有私有成员。
如果您将接口本身设为通用,则可以在接口上使用通用 属性:
public interface IDataCacheMember<T>
{
List<T> Data { get; }
}
并将其与类型参数一起使用:
public class StateMap : IDataCacheMember<States>
{
// ...
}
注意:接口上不能有私有成员。这没有意义,因为接口仅描述了向外合同。您可能想改用抽象 class。
您的代码无法编译,这总是一个不好的迹象:)
您的缓存有两个重要问题:
- 它不是线程安全的。
- 缓存的值可以由其用户修改。
正如 Scott Chamberlain 所建议的,请查阅 MemoryCache
class。
我正在尝试为缓存创建接口 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 等)。
问题是我找不到为 _data
和 Data
.
实现我的目标的最佳方法是什么?我可以为 _data
和 Data
使用通用的 return 类型吗?或者我应该使用另一种更好的模式吗?
您必须使界面本身通用:
public interface IDataCacheMember<T>
{
List<T> Data { get; set; }
}
此外,接口不能有私有成员。
如果您将接口本身设为通用,则可以在接口上使用通用 属性:
public interface IDataCacheMember<T>
{
List<T> Data { get; }
}
并将其与类型参数一起使用:
public class StateMap : IDataCacheMember<States>
{
// ...
}
注意:接口上不能有私有成员。这没有意义,因为接口仅描述了向外合同。您可能想改用抽象 class。
您的代码无法编译,这总是一个不好的迹象:)
您的缓存有两个重要问题:
- 它不是线程安全的。
- 缓存的值可以由其用户修改。
正如 Scott Chamberlain 所建议的,请查阅 MemoryCache
class。