是否有MEF的配置文件设置,或者一切都是在代码中完成的?
如果一切都在代码中,那么在执行导出的不同类之间切换的一些最佳实践是什么?也就是说,如果A类和B类都导出IMyExport,那么有哪些好方法可以将应用程序“配置”为使用A或B?
发布于 2012-07-21 03:50:13
据我所知,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可以多次导出,则可以使用add metadata to the export,并在运行时根据其元数据决定要使用哪个导出。如果您遵循这个方向,您的代码将如下所示
[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
}
}https://stackoverflow.com/questions/11585597
复制相似问题