我知道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
}
答案 0 :(得分:2)
即使在Web应用程序的上下文中,也存在具有全局范围的对象。其中之一是由框架创建的System.Web.HttpApplication。静态实例也具有全局范围。这些全局对象的生命周期与应用程序的生命周期(而不是Web请求)有关。框架可能会停止并启动您的应用程序(想想应用程序池回收)。
在Web应用程序的上下文中,单例也具有全局范围,因此它们与应用程序的生命周期相关联,并且在每个请求结束时不会被销毁。在重新启动Web应用程序时,它们可能会被销毁并重新创建,但这不应计入您的应用程序。
同样要完成别人所说的话,单身人士通常是邪恶的,你应该在设计单身人物之前三思而后行,除非他们正是你所需要的。您可能希望确保只有一个实例的一些示例是日志记录,缓存,NHibernate会话工厂和其他交叉基础架构组件,以及仅作为一个实例存在的资源模型。
答案 1 :(得分:0)
正如雷诺斯所说:单身者 邪恶。
但回答你的问题,单身人士并没有为每个请求进行实例化或销毁,但是它仍然保留在内存中,并且在所有请求之间共享,无论何时发出请求。
我不完全明白你的意思是什么?为什么有些人会明确地让请求范围内的单身人士?。你在谈论一个特定的框架吗? (出于某种原因,我感觉你在谈论Spring)。你能举例说明你所指的是什么吗?