C# 类库 - 单一实例设计模式
本文关键字:实例 设计模式 单一 类库 | 更新日期: 2023-09-27 18:17:40
背景/问题:
我对单例设计模式相当陌生。我已经在 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;
}
}
附加信息:
以下是我要完成的任务:我有一个 Web 应用程序,它将从第三方应用程序接收 XML 请求。此 XML 将告诉我的 Web 应用程序执行以下三件事之一(或所有三件事(。我想要一个类的单例实例,该实例存储可由多个类访问的数据。我希望单例实例在每次请求后死亡。如果上述方法无法实现此目的,那么实现它的最佳方法是什么?
注意:此 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;
}
}
}
它将通过多次调用持久化,但有一个警告。静态变量的作用域为 AppDomain,因此每当回收 IIS 工作进程时,存储在静态变量中的任何数据都将丢失。会话数据也是如此,如果您将其存储在"proc 中"。
如果需要仅在 HTTP 请求期间存在的对象,则可以使用 HttpContext.Items 属性。
由于单一实例是静态的,因此您的数据可用于 Web 应用程序中的所有请求,因此它不仅可用于会话。
但在 ASP.NET 应用程序中,应避免使用单例。相反,您应该使用应用程序对象。主要原因是,如果您将使用 Web 场,那么您的单一实例不再是应用程序范围的单例,而仅在计算机上。
哦!如果要使用实例 PER REQUEST,为什么不将其作为参数传递给要调用的方法,或作为需要 xml 的类的构造函数参数传递。我认为这将是最好的设计方法。