use*_*060 1 c# caching webforms
我正在使用C#webforms构建一个内部网.我有一个列表对象,其中包含一堆我正在缓存的用户.我正在尝试创建一个构造函数,当我引用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;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
您无法创建执行此操作的构造函数.构造函数始终创建一个新对象.
而是创建一个静态工厂方法:
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>静态初始化程序保证或锁定.