我建立使用C#web表单内联网。 我有一帮网友我敢cacheing一个列表对象。 我试图创建一个构造函数,当我引用MainADList,将做到以下几点:
- 如果它存在于缓存中,不为空,用它
- 否则生成列表,并将它缓存
我已经得到了代码做缓存和检索,但没有,我想办法很好地封装。
public Users MainADList = new Users();
private void GenerateADList()
{
MainADList = (Users) Cache["MainADList"];
if (MainADList == null || MainADList.Count == 0)
{
//generate the list....
Cache["MainADList"] = MainADList;
}
}
谢谢!
您不能创建一个构造函数 ,这样做的。 构造函数总是创建一个新的对象。
相反,创建一个静态工厂方法:
public static Users GetUsers()
{
// Consult the cache, and create a new instance if necessary.
}
这可能是一个单 -但它肯定不会要。 (我不会人为地强加其单岬,除非我真的服了。我不是单例模式的忠实粉丝。)
或者,而不是一个静态的工厂方法,你可以在一个工厂类的实例方法:
public class UsersFactory
{
// Construct it with a cache, or whatever's required
public Users GetUsers()
{
// Use the cache, or construct a new value.
}
}
现在,这是更容易测试 - 因为你不依赖于任何静态(全局)状态。 相反,你可以在每个测试一个新的高速缓存中创建一个新的工厂。
在所有这些解决方案,你需要考虑你想要什么的线程行为。 如果你想确保你只构建值一次,你将需要使用Lazy<T>
静态初始化的保证,或锁定。
一个通用的模式,你可以遵循:
public class ClassName {
public static Object CachedObject {
get {
Object o = (Object)Cache['CacheKey'];
if (o == null)
{
o = GetData();
Cache["CacheKey"] = o;
}
return o;
}
}
}
和治疗ClassName.CachedObject,好像它一直,永远和神奇填充。
你想要的是被称为辛格尔顿。
基本上你应该用你已有的代码做的是这样的:
public static GetList
{
get
{
//check if list exists and create it - so basically call your private constructor
//return cached list
}
}