Singleton和HttpApplicationState

时间:2010-02-01 20:43:06

标签: c# .net asp.net singleton

在Web应用程序中,我只需要一个名为ProcessManager的类的实例。一种方法是使它成为单身人士。另一种方法是使用HttpApplicationState来确保我总是访问同一个实例,如下所示:

public static ProcessManager ProcessManager
        {
            get 
            {
                HttpApplicationState applicationState = HttpContext.Current.Application;
                if (applicationState["ProcessManager"] == null)
                {
                    applicationState["ProcessManager"] = new ProcessManager();
                }

                return (ProcessManager)applicationState["ProcessManager"];
            }
        } 

哪种方法更好,为什么?

3 个答案:

答案 0 :(得分:7)

基于你给出的有限描述,我会选择一个Singleton,因为它不依赖于HttpContext.Current,并且可以在ASP.Net管道之外使用(例如,当你想写单元测试。)

(顺便说一下,当你在ApplicationState中设置一些东西时,你还需要首先在它上面调用Lock(),然后在你写完之后解锁()它,以确保它是线程安全的。)

或者,在创建ProcessManager时允许注入HttpContext,这样就可以将它与模拟的HttpContext一起使用。

答案 1 :(得分:2)

如果您计划将其实施为单身,as per Jon Skeet(a.k.a C#guru),他个人更喜欢以下代码

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

答案 2 :(得分:1)

(我假设您的ProcessManager构造函数是私有的。)

使它成为一个真正的单例是最好的,因为这样的方法会使其他程序员在结构上不可能维护你的代码意外地创建多个实例。没有什么能阻止消费者直接访问HttpApplicationState并删除和替换ProcessManager实例。因此,您必须依赖约定来保护HttpApplicationState中的ProcessManager实例。

只有存在多个类实例的实际用例时才允许多个实例化,同时依赖约定来保护HttpApplicationState中的实例。