ASP .NET Singleton
只是想确保我在这里没有假设一些愚蠢的事情,当在ASP.NET Web应用程序中实现单例模式时,静态变量作用域仅用于当前用户会话,对吗?如果第二个用户正在访问该站点,则它是另一个内存作用域…?
静态成员只具有当前工作进程的作用域,因此它与用户无关,因为其他请求不一定由同一个工作进程处理。
- 要与特定用户和跨请求共享数据,请使用httpcontext.current.session。
- 要在特定请求中共享数据,请使用httpcontext.current.items。
- 为了在整个应用程序中共享数据,要么为此编写一个机制,要么配置IIS与单个进程一起工作,并编写一个单例/使用应用程序。
顺便说一下,工作进程的默认数目是1,所以这就是为什么Web上充满了认为静态成员拥有整个应用程序范围的人的原因。
静态变量范围是针对整个应用程序域的,这意味着其他会话也可以访问它。只有当您的服务器场具有不同的服务器时,您才会拥有该变量的多个实例。
正如其他人提到的,静态变量是整个应用程序的全局变量,而不是单个请求。
要使单例全局请求仅限于单个请求,可以使用
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页的视图状态。