Singleton vs Cache ASP.NET

时间:2008-11-19 14:33:36

标签: asp.net caching concurrency singleton

我在.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;
        }
    }
}

6 个答案:

答案 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对象。这两种解决方案都将有效地为您服务,但是要获得任何积极的效果,请确保使用缓存/单例。无论哪种情况,如果您的数据不可用,那时候都应该刷新两者。