关于ASP .NET C #:Singleton

ASP .NET Singleton

只是想确保我在这里没有假设一些愚蠢的事情,当在ASP.NET Web应用程序中实现单例模式时,静态变量作用域仅用于当前用户会话,对吗?如果第二个用户正在访问该站点,则它是另一个内存作用域…?


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

  • 要与特定用户和跨请求共享数据,请使用httpcontext.current.session。
  • 要在特定请求中共享数据,请使用httpcontext.current.items。
  • 为了在整个应用程序中共享数据,要么为此编写一个机制,要么配置IIS与单个进程一起工作,并编写一个单例/使用应用程序。

顺便说一下,工作进程的默认数目是1,所以这就是为什么Web上充满了认为静态成员拥有整个应用程序范围的人的原因。


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


正如其他人提到的,静态变量是整个应用程序的全局变量,而不是单个请求。

要使单例全局请求仅限于单个请求,可以使用HttpContext.Current.Items字典。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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"];
        }
    }
}


如果您需要它是基于用户或会话的,请查看以下链接。否则,正如Otavio所说,单例可以用于整个域。

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


singleton用于整个应用程序域,如果要存储与用户会话相关的数据,请使用为此目的设计的httpcontext会话。当然,您可能需要重新设计类结构,以便能够想出一种键值对的方法来处理您要处理的数据。


每个用户的整个应用程序会话。单个ASP页的视图状态。