2010-01-25 37 views
31

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

+6

简短的回答是否定的,你错了。 – 2010-01-25 18:20:06

+1

Duplicate:http://stackoverflow.com/questions/194999/are-static-class-instances-unique-to-a-request-or-a-server-in-asp-net – 2010-01-25 19:17:31

回答

28

静态变量作用域适用于整个应用程序域,这意味着其他会话也可以访问它。只有当你有一个服务器不同的服务器场时,你才会有多个变量实例。

+3

+1“只有当你有一个具有不同服务器的农场,你将拥有多个变量实例“。 – 2016-07-26 12:20:08

4

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

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

+0

你的链接似乎已经死了 – 2011-07-14 16:14:23

+2

@Michael Lang:是的,看起来像山姆改变了他的内容引擎。用新的参考更新链接。 – NotMe 2011-07-14 16:51:46

0

该单是用于整个应用领域,如果要存储用户会话相关的数据,使用的HttpContext会话这是专为这一目的。当然,您可能必须重新设计您的班级结构,以便能够提出处理您尝试使用的数据的键值对方式。

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

谢谢,这是什么开销?如果我经常访问单例,它会慢很多吗? – Wesly 2010-01-25 18:40:47

+0

@Ws您不应该注意到这种方法的任何性能问题。字典的实现非常高效,所以即使你访问它,它也不会减慢你的应用程序。 – 2010-01-25 19:16:14

+0

为什么我们应该使用“HttpContext.Current.Items”而不是“Session”? – Seva 2014-10-09 13:09:41

32

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

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

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

-2

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