Singleton Pattern如何在Web范围内工作?

时间:2011-10-09 20:22:31

标签: .net design-patterns web-applications singleton

我知道Singleton模式是如何工作的,但我怀疑它在Web范围内是如何工作的。是不是自然要求?

发出请求并实例化单例并且请求已结束。单身人士被摧毁了?如果是的话,为什么有些人会明确地让请求范围内的单身人士?如果不是,会发生什么?单例保留在内存中,并为每个请求创建一个新单词吗?

更新

当我说“为什么有些人明确地让请求范围中的单身人士”时,例如使用Ninject我必须这样做:

Bind<ISession>().To(SessionSingleton.Instance).InRequestScope();

更新2:

using System;

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

更新3:

我的DbContext是单身人士?我想不,我的DbContextFactory是单身,但是在这种情况下我的DbContext会在请求结束时被销毁吗?

public class DbContextFactory
{
    #region Fields

    private static volatile DbContextFactory _dbContextFactory;
    private static readonly object SyncRoot = new Object();
    public DbContext Context;

    #endregion

    #region Properties

    public static DbContextFactory Instance
    {
        get
        {
            if (_dbContextFactory == null)
            {
                lock (SyncRoot)
                {
                    if (_dbContextFactory == null)
                        _dbContextFactory = new DbContextFactory();
                }
            }
            return _dbContextFactory;
        }
    }

    #endregion

    #region Methods

    public DbContext GetOrCreateContext()
    {
        if (this.Context == null)
            this.Context = new DbContext(ConfigurationManager.AppSettings["DefaultConnectionString"]);

        return Context;
    }

    #endregion
}

2 个答案:

答案 0 :(得分:2)

即使在Web应用程序的上下文中,也存在具有全局范围的对象。其中之一是由框架创建的System.Web.HttpApplication。静态实例也具有全局范围。这些全局对象的生命周期与应用程序的生命周期(而不是Web请求)有关。框架可能会停止并启动您的应用程序(想想应用程序池回收)。

在Web应用程序的上下文中,单例也具有全局范围,因此它们与应用程序的生命周期相关联,并且在每个请求结束时不会被销毁。在重新启动Web应用程序时,它们可能会被销毁并重新创建,但这不应计入您的应用程序。

同样要完成别人所说的话,单身人士通常是邪恶的,你应该在设计单身人物之前三思而后行,除非他们正是你所需要的。您可能希望确保只有一个实例的一些示例是日志记录,缓存,NHibernate会话工厂和其他交叉基础架构组件,以及仅作为一个实例存在的资源模型。

答案 1 :(得分:0)

正如雷诺斯所说:单身者 邪恶。

但回答你的问题,单身人士并没有为每个请求进行实例化或销毁,但是它仍然保留在内存中,并且在所有请求之间共享,无论何时发出请求。

我不完全明白你的意思是什么?为什么有些人会明确地让请求范围内的单身人士?。你在谈论一个特定的框架吗? (出于某种原因,我感觉你在谈论Spring)。你能举例说明你所指的是什么吗?