2013-12-08 47 views
6

我使用MEF和我有兩個出口具有相同的合同類型,但具有不同的合同名稱服務定位器:獲取所有出口

如:

[Export("TypeA", typeof(MyPlugin))] 
[Export("TypeB", typeof(MyPlugin))] 

我可以使用檢索每個出口其各自的合同名稱:

ServiceLocator.GetExportedValues<MyPlugin>("TypeA"); 

但現在我想找回實施MyPlugin所有實例。有什麼辦法可以做到嗎?

我用下面的代碼嘗試:

ServiceLocator.GetExportedValues<MyPlugin>(); 

但沒有奏效。顯然,它僅用於檢索沒有特定合約名稱的實施。

有沒有意見嗎?

回答

4

獲得futher信息,我只想補充一個無名出口旁邊每個命名的出口,如果你希望它是分辨兩者兼得。例如

// named and nameless 
[Export("TypeA", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

// named nameless, again 
[Export("TypeB", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

class MyPlugin { } 


[TestMethod] 
public void mef() 
{ 
    var catalog = new AssemblyCatalog(this.GetType().Assembly); 
    var container = new CompositionContainer(catalog); 

    Assert.AreEqual(2, container.GetExportedValues<MyPlugin>().Count()); 
} 
0

您可以使用強類型元數據導出。

  1. 創建一個繼承自ExportAttribute的自定義屬性,該屬性從接口實現。
  2. 使用此自定義屬性而不是導出。

您可以使用導入來獲取所需的類型。

[ImportMany] 
public IEnumerable<Lazy<YourType,IMetadataAttribute>> Plugins{get;private set;} 

您可以從MEF Documentation

0

聲明兩種類型的Export

[Export(typeof(IFoo)),Export("TypeA", typeof(IFoo))] 
public class Foo1 : IFoo { } 

[Export(typeof(IFoo)),Export("TypeB", typeof(IFoo))] 
public class Foo2 : IFoo { } 

而且使用ImportMany

[ImportMany] 
IFoo[] foos; 
+1

這是怎麼回答比@ default.kramer的任何不同的導入? –

+0

聲明是一樣的,但我也告訴你如何讓Mef注入所有實例而不必直接引用容器/目錄......這是如何使用DI框架的正確方法。 –