是否有任何 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
}
}