创建构造函数(?)以从缓存中检索对象或重新创建(如果为null)

use*_*060 1 c# caching webforms

我正在使用C#webforms构建一个内部网.我有一个列表对象,其中包含一堆我正在缓存的用户.我正在尝试创建一个构造函数,当我引用MainADList时将执行以下操作:

  1. 如果它存在于缓存中并且不为null,请使用它
  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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jon*_*eet 6

您无法创建执行此操作的构造函数.构造函数始终创建一个新对象.

而是创建一个静态工厂方法:

public static Users GetUsers()
{
    // Consult the cache, and create a new instance if necessary.
}
Run Code Online (Sandbox Code Playgroud)

可能是一个单身人士 - 但肯定不是必须的.(除非我真的不得,否则我不会人为地强加其单身.我不是单身人士模式的忠实粉丝.)

或者,您可以在工厂类中使用实例方法,而不是静态工厂方法:

public class UsersFactory
{
    // Construct it with a cache, or whatever's required

    public Users GetUsers()
    {
        // Use the cache, or construct a new value.
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这更容易测试 - 因为你不依赖于任何静态(全局)状态.相反,您可以在每个测试中从新缓存创建新工厂.

所有这些解决方案中,您需要考虑所需的线程行为.如果要确保只构造一次值,则需要使用Lazy<T>静态初始化程序保证或锁定.