簡體   English   中英

靜態集合和asp.net

[英]Static collection and asp.net

我正在開發一個通用層,該層允許我執行基本的保存,刪除和加載操作,但是遇到了我也不知道答案的問題,並立即想到了StackOverflow。

我有一個asp.net應用程序,該應用程序引用了一個單獨的項目(包含我所有類定義的業務層)。 我的一個類(ObjectFactory)負責實例化對象並將它們存儲在靜態字典中(私有)。 這樣的想法是,如果它已經被實例化,它將從靜態集合中檢索其定義。 我之所以選擇這樣做,是因為我只想一次獲取一個類的propertyinfo [],根據Joel Pobar的MSDN文章所述,獲取此信息非常昂貴。

我的問題是,盡管asp.net項目引用了包含我所有業務邏輯的類庫,但此靜態集合是否可以在全球使用? 例如,如果兩個用戶同時在我的網站上並訪問我的網站的兩個獨立部分,其中涉及實例化兩個獨立的對象,ObjectFactory中的緩存將包含這兩個項目嗎? 還是基於每個用戶的靜態集合,即靜態集合將僅包含特定用戶的項目?

由於我的業務層無權訪問Web緩存,因此我不確定是否要使我的業務層引用System.Web,然后將其插入其中?

抱歉,我可能對任何人都感到困惑,但也很樂意在需要時提供更多信息。

在此先感謝,Onam。

存儲在靜態變量中的對象在整個App Domain中共享。 所有線程(所有Web請求)將使用相同的值。 這意味着這些對象必須是線程安全的,否則您將走向失敗,並且-當然-這只會在您投入生產后才會失敗,因為這些問題通常不會在開發過程中顯示出來,並且通常不會出現在開發過程中。也要分階段進行(通常沒有人在那個時候真正地測試您的系統)。

除了@Steven的答案外,我還要補充一下,每次應用程序池回收時,靜態集合都會被清空,而且如果您最終在多台服務器上運行,則每個服務器都將擁有自己的集合。

因此,除了使字典線程中的項目安全之外,還應使用ConcurrentDictionary及其GetOrAdd和AddOrUpdate方法來確保對字典本身的線程安全訪問,而不是普通的Dictionary類,后者不是線程安全的。

在給定的應用程序生命周期內,常規靜態字段可用於所有線程。

無論如何,使用靜態字段時要小心。 請注意以下事實:常規Dictionary<TKey, TValue>不是線程安全的。

您將需要在執行任何寫操作(添加,刪除...)時考慮阻止其他線程進入字典,否則將出現同步問題(例如,屬性的反映信息可能被添加兩次或更多) - )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM