2012-07-20 77 views
5

是否有任何用於MEF的配置文件設置,或者是否在代碼中完成了一切?MEF配置

如果一切都在代碼中,那麼在導出的不同類之間切換的最佳做法是什麼?即如果A類和B類都輸出IMyExport,有什麼方法可以「配置」應用程序使用A或使用B?

回答

7

據我所知,MEF沒有配置文件。如果你希望你的應用程序使用另一個實現,你可能會創建一個新的ConfigurationCatalog,它將得到一個配置文件作爲輸入,並且只會導出它告訴它的部分。有可能在MefContrib已經存在,所以我會在那裏檢查。

除此之外,由類自己來決定他們想使用哪個實現。一種可能的方式來實現你想要的是通過使用合同名稱

[Export("My Contract Name", typeof(IMyExport))] 
public class A : IMyExport { } 

[Export("Another Contract Name", typeof(IMyExport))] 
public class B : IMyExport { } 

那麼該類進口IMyExport可以指定它要使用

[Import("Another Contract Name")] 
public IMyExport MyExport { get; set; } 

如果您知道零件的某一個依賴IMyExport可以多次導出,您可以在運行時根據其元數據在運行時決定要使用哪個導出。如果你朝那個方向走,你的代碼看起來像這樣

[MySpecialExport(SomeData = "ABC")] 
public class A : IMyExport { } 

[MySpecialExport(SomeData = "DEF")] 
public class B : IMyExport { } 

public class MyClass 
{ 
    [ImportMany(typeof(IMyExport))] 
    public IEnumerable<Lazy<IMyExport, IMyExportMetadata>> MyProperty { get; set; } 

    public void DoSomething() 
    { 
     var myLazyExport = MyProperty.FirstOrDefault(x => x.Metadata.SomeData == "DEF"); 
     IMyExport myExport = myLazyExport.Value; 

     // Do something with myExport 
    } 
}