ASP .NET Singleton

时间:2010-01-25 18:17:04

标签: c# asp.net static singleton

只是想确保我在这里假设一些愚蠢的东西,在ASP .Net Web应用程序中实现单例模式时,静态变量作用域仅适用于当前用户会话,对吧?如果第二个用户正在访问该站点,则它是一个不同的内存范围......?

6 个答案:

答案 0 :(得分:34)

静态成员只具有当前工作进程的范围,因此它与用户无关,因为其他请求不一定由同一工作进程处理。

  • 为了与特定用户和请求共享数据,请使用HttpContext.Current.Session。
  • 要在特定请求中共享数据,请使用HttpContext.Current.Items。
  • 为了在整个应用程序中共享数据,要么为其编写机制,要么将IIS配置为使用单个进程并编写单例/使用应用程序。

顺便说一句,默认的工作进程数是1,所以这就是为什么网络上充满了人们认为静态成员具有整个应用程序的范围。

答案 1 :(得分:31)

静态变量范围适用于整个app域,这意味着其他会话也可以访问它。只有当您拥有具有不同服务器的服务器场时,才能拥有多个变量实例。

答案 2 :(得分:15)

正如其他人所提到的,静态变量是global to the entire application, not single requests.

要将单例全局设置为仅针对单个请求,可以使用HttpContext.Current.Items字典。

public class Singleton
{
    private Singleton() { }

    public static Singleton Instance 
    {   
        get
        {
            if (HttpContext.Current.Items["yourKey"] == null)
                HttpContext.Current.Items["yourKey"] = new Singleton();
            return (Singleton)HttpContext.Current.Items["yourKey"];
        }
    }
}

答案 3 :(得分:4)

如果您需要基于用户或会话,请查看以下链接。否则,正如奥塔维奥所说,单身人士可以在整个领域使用。

http://samcogan.com/singleton-per-asp-net-session/

答案 4 :(得分:0)

单例用于整个应用程序域,如果要存储与用户会话相关的数据,请使用专为此目的设计的HttpContext会话。当然,您可能需要重新设计类结构,以便能够提供一种键值对方式来处理您尝试使用的数据。

答案 5 :(得分:-3)

每个用户的整个应用程序的会话。 单个asp页面的ViewState。