2010-07-14 146 views
4

我正計劃在ASP.NET中使用MEF,以尋找對CompositionContainer的線程安全性的一些見解。線程安全和MEF CompositionContainer

我的第一種方法是將不同的CompositionContainer與每個請求關聯起來,但我擔心這樣做會很昂貴,而且不能很好地擴展,另一方面,CompositionContainer通過構造函數中的簡單標誌支持線程安全操作。

我也考慮過使用線程安全靜態CompositionContainer和每個請求綁定的混合方法。

除了線程安全性參數之外,我非常依賴ExportFactory來根據需要構造對象。儘管如此,我仍然被這個ExportLifeTimeContext所迷惑,我不確定這種方法的資源需求。

有人對此有所瞭解嗎?

回答

5

創建CompositionContainers很便宜,所以應該可以爲每個請求創建一個。創建目錄並不便宜,但目錄是線程安全的,因此您應該能夠在啓動時創建一個全局目錄並將其用於每個請求。

需要注意的一件事是即使是「線程安全的」組合容器對於可能導致重組的操作(例如更改目錄或調用容器上的Compose方法)也不是線程安全的。

至於混合方法,如果您有一些要在請求和某些您希望成爲請求特定的部分之間共享的部分(應該是線程安全的),那麼您將轉到該路由。在這種情況下,只有共享容器需要創建爲線程安全。

+0

解決了這個問題,目錄只在啓動時建立一次。沒有重組。每次請求我都會有一個獨立的容器。應該管用。謝謝! – 2010-07-15 06:21:39

+0

它在哪裏說目錄是線程安全的?我似乎沒有發現有記錄 – 2014-05-04 01:22:11

+2

@jws_請參閱MSDN文檔中的備註部分,例如ComposablePartCatalog:http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.primitives.composablepartcatalog( v = vs.110)的.aspx – 2014-05-05 05:14:57