创建构造函数(?)从缓存中检索对象或重新创建,如果空(Create constructor(?) t

2019-10-17 14:09发布

我建立使用C#web表单内联网。 我有一帮网友我敢cacheing一个列表对象。 我试图创建一个构造函数,当我引用MainADList,将做到以下几点:

  1. 如果它存在于缓存中,不为空,用它
  2. 否则生成列表,并将它缓存

我已经得到了代码做缓存和检索,但没有,我想办法很好地封装。

public Users MainADList = new Users();

private void GenerateADList()
{
    MainADList = (Users) Cache["MainADList"];

    if (MainADList == null || MainADList.Count == 0)
    {
       //generate the list....

       Cache["MainADList"] = MainADList;
    }
 }

谢谢!

Answer 1:

您不能创建一个构造函数 ,这样做的。 构造函数总是创建一个新的对象。

相反,创建一个静态工厂方法:

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>静态初始化的保证,或锁定。



Answer 2:

一个通用的模式,你可以遵循:

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,好像它一直,永远和神奇填充。



Answer 3:

你想要的是被称为辛格尔顿。

基本上你应该用你已有的代码做的是这样的:

public static GetList
{
   get 
      {
          //check if list exists and create it - so basically call your private constructor
          //return cached list
      }
}


文章来源: Create constructor(?) to retrieve object from cache or recreate if null