c# - 单例和 HttpApplicationState

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

哪种方法更好,为什么?

最佳答案

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

(顺便说一句,当您将某些内容设置到 ApplicationState 中时,您还需要先对其调用 Lock(),然后在完成写入后对其进行 Unlock(),以确保它是线程安全的。)

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

关于c# - 单例和 HttpApplicationState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179923/

相关文章:

asp.net - jquery 禁用按钮上的回发 Asp.net

c# - ActiveDirectory 中用户的 Guid 是否可以为空?

c# - 是否可以包装特定的类或方法并将它们分配给线程?

c# - 如何验证电话号码字段以仅接受数字和最多 12 位数字?

c# - 连接Godaddy mysql服务器时出现错误

c# - Unity 5.6 - C# - 使用 AddComponent<T> 将一个游戏对象添加到另一个游戏对象

c# - 提高单个网络服务的超时时间

.net - 如何从 F# 中的数组列表中提取元素?

javascript - 如何将 JSON 数组反序列化为 native .net 数据结构?

c# - 启动 Bing map 时应使用哪个 API