背景/问题:C#类库 - Singleton设计模式
我是相当新的Singleton设计模式。我已经在Web应用程序中使用一次(与SO社会的帮助下):
public static AppGlobal Instance
{
get
{
if (HttpContext.Current.Session != null)
{
HttpSessionState session = HttpContext.Current.Session;
if (session["AppGlobalInstance"] == null)
{
session["AppGlobalInstance"] = new AppGlobal();
}
return (AppGlobal)session["AppGlobalInstance"];
}
else
{
return null;
}
}
}
上述实施对我来说很有意义,因为AppGlobal
的实例存储在会话中。当会话消失时,AppGlobal
死亡。如果我在由Web应用程序调用的类库中使用相同的设计模式,会发生什么情况?例如,用户请求一个调用不知道会话的DLL中的方法的页面。存储在单例实例中的数据是否会通过多次调用持续存在?
private static readonly Singleton instance = new Singleton();
private Singleton() { }
public static Singleton Instance
{
get
{
return instance;
}
}
附加信息:
这里就是我要完成的:我有一个要接收来自第三方应用XML请求的Web应用程序。这个XML将告诉我的Web应用程序执行三件事中的一件(或全部三件)。我想有一个类的单例实例存储可以被多个类访问的数据。我希望每个请求后单例实例到DIE。如果上述内容没有完成这个,那么完成它的最好方法是什么?
注意:此Web应用程序在单个服务器上运行,并且从不在服务器场上运行。
编辑1:
基于下面的建议下,我用System.Web.HttpContext.Current.Session
来存储我的类的实例。这看起来像是对每个会话都是独一无二的单身人士的正确方法吗(记得我在一个班级图书馆里)?
public static Ariba Instance
{
get
{
if (HttpContext.Current.Session != null)
{
HttpSessionState session = HttpContext.Current.Session;
if (session["AribaInstance"] == null)
{
session["AribaInstance"] = new Ariba();
}
return (Ariba)session["AribaInstance"];
}
else
{
return null;
}
}
}
你提到你希望在每个**请求**后单身死亡。如果是这样的话,你不需要在会话中存储任何东西。相反,您可以将对象存储在HttpContext.Current.Items [“AribaInstance”]中。我会补充一点,如果你使用HttpContext.Current,你将会遇到一些单元测试你的类库的困难,因为HttpContext.Current不会被填充到ASP.NET之外(Session也是如此)。如果单元测试对你很重要,你需要包装上下文和会话对象。 –
@AndyWilson,谢谢你的领导,并为答案! –