2012-01-09 33 views
9

我的解決方案中有一個靜態類,用於處理各種程序集。我想通過MEF鏈接他們,所以我在課堂上做了一個領域。C#使用靜態類的MEF

[Import(typeof(A))] 
    static private A _a1; 

然後,我有一個方法,而我通過裝配名作爲參數:

public static A LoadPackage(string filePath) 
    { 
      var catalog = new AggregateCatalog(); 
      catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
      var _container = new CompositionContainer(catalog); 
      ??? 
    } 

那麼,現在有一種方法從裝配通過指定文件路徑來導入類型?

我不能這樣做:

_container.ComposeParts(this); 

,因爲類是`靜態無論是我能做到這一點

_container.ComposeParts(_a1); 

(這可能是完全錯誤的開始),因爲A不有任何構造函數(所以_a1爲空)

+1

是否有一個原因,它需要是靜態的?你導入/導出的任何東西默認都是Singelton,在大多數情況下比靜態類更好。 – eandersson 2012-01-09 09:29:43

+0

這是我正在考慮的選項之一。保持靜態的原因是我不想在我的項目中更改代碼(即 - 我很懶+)) – noaRAVE 2012-01-09 09:45:09

+0

我很確定你不能直接使用靜態類與MEF,但我不會當然不知道。 – eandersson 2012-01-09 09:46:00

回答

6

那麼事實證明這個方法我一直在尋找的是GetExportedValue(是的,我忽略了基本功能):

static private A _a1; 

public static A LoadPackage(string filePath) 
{ 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
     var _container = new CompositionContainer(catalog); 
     _a1 = _container.GetExportedValue<A>(); 
} 

而且我得到了我的領域填補(以防萬一,我已經把它移到另一個類,它現在看起來整齊乾淨)

+0

不是一個好的解決方案 - 正如Wim上面提到的,更好地使用MEF導入共享部分儘可能避免使用靜態類/方法。 – 2012-03-29 22:38:17

11

MEF旨在爲您創建並初始化對象。它不處理靜態類中的狀態。

我建議你讓這個類和它的字段是非靜態的,如果你想強制單例行爲,用[PartCreationPolicy(CreationPolicy.Shared)]來標記它。

在MEF和單件模式也this other question見。