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;
            }
        }
    }

C# 类库 - 单一实例设计模式

它将通过多次调用持久化,但有一个警告。静态变量的作用域为 AppDomain,因此每当回收 IIS 工作进程时,存储在静态变量中的任何数据都将丢失。会话数据也是如此,如果您将其存储在"proc 中"。

如果需要仅在 HTTP 请求期间存在的对象,则可以使用 HttpContext.Items 属性。

由于单一实例是静态的,因此您的数据可用于 Web 应用程序中的所有请求,因此它不仅可用于会话。

但在 ASP.NET 应用程序中,应避免使用单例。相反,您应该使用应用程序对象。主要原因是,如果您将使用 Web 场,那么您的单一实例不再是应用程序范围的单例,而仅在计算机上。

哦!如果要使用实例 PER REQUEST,为什么不将其作为参数传递给要调用的方法,或作为需要 xml 的类的构造函数参数传递。我认为这将是最好的设计方法。