2013-08-29 20 views
0

我可以將我的活動實體框架數據庫上下文的請求,作爲一個靜態屬性某處,所以它很容易從可提取驗證器,助手等ASP.NET MVC中的每個請求是否與其他請求共享靜態變量?

**例如,從全球行動過濾器設置到一個靜態類如

public static DBContext GlobalHelper.ActiveDbContextForRequest; 

是否每個請求都共享這些靜態屬性?如果他們這樣做,我認爲它不能工作。

+1

靜態變量將/只能在*相同*應用程序域中共享[對所有線程]。多個工作流程自然有不同的應用領域。我會避免使用靜態變量的模式,而是使用DI來乾淨地解決這個問題 - 能夠輕鬆地指定服務(包括「便利屬性」)和控制生命週期(單一/請求/共享)。 – user2246674

+0

謝謝!(天哪,總是有更多東西要學習,不在那裏!!)。所以這就是爲什麼人們使用DI?你推薦任何DI庫嗎? – Baconbeastnz

+1

我使用DI是因爲我很懶>:D(我曾經使用過靜態變量,但是當它可以應用到整個堆棧中時,我看到了「帶有構造函數注入的光源」。另外,ReSharper確實有助於自動添加新的成員基於構造函數參數)。我目前最喜歡的DI是Autofac(用於WS + ASP.NET WebForms),但有很多選擇。只要確保它具有適當的集成(應該適用於所有主流),以使設置變得簡單/簡單。 – user2246674

回答

2

是的,靜態變量在整個應用程序中共享(在所有線程上)。您不能安全地訪問這些變量,而無需同步各種請求(因爲每個請求都在不同的線程上處理)。

即使您對這些變量的訪問進行同步,也只有一個靜態變量實例,因此所有線程都會看到相同的值 - 您無法通過這種方式獲得特定於請求的值。

+0

注意:可以使用[線程本地存儲](http://msdn.microsoft.com/en-us/library/vstudio/6sby1byh(v = vs.100))建立請求特定的* static *變量。 aspx)和正確的設置/拆卸(我相信每個「正常」請求都有一個線程獨佔保證)。然而,DI是一個非常乾淨的解決方案 - 我提到這只是爲了指出靜態變量*可以作爲線程本地化的,並不意味着它們應該被使用。 – user2246674

+0

@ user2246674是的,雖然TLS變量並非真正的靜態,但它們是按每個線程分配的。 – xxbbcc

1

默認情況下,靜態變量對整個應用程序域是全局的,所以答案是肯定的,它們由它服務的所有請求共享。

+0

*咳嗽*整個應用領域*咳嗽*。我在系統> 1進程(和> 1服務器)上工作。在過去,我爲自己設定了一些問題,假設單個(或永久)應用程序域處理所有請求 - 肯定需要謹慎處理,否則測試/生產可能會出錯。 – user2246674

+0

@ user2246674:你是正確的,通過應用程序域更改進程。 –

相關問題