我在.NET中创建了一个单例的注册表类。显然,这个单例的行为就像它保存在Cache中一样(单个对象可用于每个会话)。如果我将此Singleton添加到缓存中,这是一个很好的做法吗? +我是否需要使用GetInstance()函数来解决并发问题?
namespace Edu3.Business.Registry
{
public class ExamDTORegistry
{
private static ExamDTORegistry instance;
private Dictionary<int, ExamDTO> examDTODictionary;
private ExamDTORegistry()
{
examDTODictionary = new Dictionary<int, ExamDTO>();
}
public static ExamDTORegistry GetInstance()
{
if (instance == null)
{
instance = new ExamDTORegistry();
}
return instance;
}
}
}
答案 0 :(得分:5)
好吧,你的GetInstance方法肯定不是线程安全的 - 如果两个线程同时调用它,它们最终可能会有两个不同的实例。我有page on implementing the singleton pattern,如果有帮助的话。
您的代码是否依赖作为单身人士?请记住,如果重新加载AppDomain,无论如何都会得到一个新实例。
我并不认为将对象放入缓存有很多好处。你有什么特别的想法吗?
答案 1 :(得分:5)
尽管他们出现在GoF单身人士中通常被视为bad practice。你有什么理由想只有一个实例吗?
答案 2 :(得分:2)
HttpContext.Cache可用于所有会话,但缓存中的项目可能会在内存过期时或内存压力下从内存中删除。
HttpContext.Application也可用于所有会话,是存储持久性应用程序范围对象的好地方。
由于你已经创建了一个单例并且它可以工作,我不明白为什么要使用其中一个内置的单例集合,除非你需要Cache给你的额外功能。
答案 3 :(得分:0)
不确定缓存是什么意思...如果你想缓存它(如...保存在内存中以便你不必从某个数据存储中再次获取它)那么是的,你可以把它放在缓存中,对所有用户来说都是全局的。会话意味着每个用户,所以我认为这不是你想要的。
答案 4 :(得分:0)
我会这样做:
private static READONLY ExamDTORegistry实例;
然后你不需要检查NULL和它的线程安全。
答案 5 :(得分:0)
我认为原来的问题更可取。如果您的数据保持静态或基本不变,则使用HTTP缓存或单例模式很有意义。如果在应用程序启动时加载了单例,则根本不会出现“线程”问题。单例放置到位后,您将收到您请求的同一实例。我在实际实现中看到的很多问题是,人们在没有充分考虑的情况下使用了这两种方法。为什么要使不可变的配置数据过期?如果有一个客户端将数据缓存在那里,并且仍然在最后一次检查ADO DB对象等内容时创建了ADO DB对象。这两种解决方案都将有效地为您服务,但是要获得任何积极的效果,请确保使用缓存/单例。无论哪种情况,如果您的数据不可用,那时候都应该刷新两者。