ASP .NET Singleton

Wes*_*sly 36 c# asp.net singleton static

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

Mos*_*ner 35

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

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

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


Otá*_*cio 33

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

  • +1"只有拥有不同服务器的服务器场才能拥有多个变量实例". (4认同)

Dan*_*ert 15

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

要将单例全局设置为仅针对单个请求,可以使用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"];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)