5
是否有任何用於MEF的配置文件設置,或者是否在代碼中完成了一切?MEF配置
如果一切都在代碼中,那麼在導出的不同類之間切換的最佳做法是什麼?即如果A類和B類都輸出IMyExport,有什麼方法可以「配置」應用程序使用A或使用B?
是否有任何用於MEF的配置文件設置,或者是否在代碼中完成了一切?MEF配置
如果一切都在代碼中,那麼在導出的不同類之間切換的最佳做法是什麼?即如果A類和B類都輸出IMyExport,有什麼方法可以「配置」應用程序使用A或使用B?
據我所知,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
}
}