2010-01-25 34 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。