Singleton和HttpApplicationState

在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"]; } } 

哪种方法更好,为什么?

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

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

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

如果你计划按照Jon Skeet (又名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; } } } 

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

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

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