ASP .NET 单例

问题描述 投票:0回答:7

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

c# asp.net static singleton
7个回答
40
投票

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

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

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


38
投票

静态变量作用域是整个应用域,这意味着其他会话也可以访问它。仅当您拥有一个拥有不同服务器的农场时,您才会拥有多个变量实例。


17
投票

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

要使单例全局仅适用于单个请求,您可以使用

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

4
投票

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

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


0
投票

单例用于整个Application Domain,如果要存储用户会话相关数据,请使用为此目的设计的HttpContext Session。当然,您可能必须重新设计您的类结构才能提出一种键值对方式来处理您尝试使用的数据。


0
投票

不,在 Web 应用程序中,在实现单例模式的类中声明的静态变量在所有用户会话以及应用程序域中的所有线程之间共享。

Web 应用程序启动时,会创建应用程序域,并初始化所有静态变量。因此,任何使用静态变量创建的 Singleton 实例都将由应用程序的所有请求和用户共享。

值得注意的是,在 Web 应用程序中使用单例模式应该谨慎,并且只有在必要时才使用。虽然 Singleton 可用于管理需要在多个请求之间共享的资源,但如果使用不当,它也会引入并发问题和其他问题。

一般来说,最好避免使用单例模式,而使用更灵活的模式,例如依赖注入,这样可以实现更好的可测试性和可维护性。


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.