我有以下类:
public class Foo
{
[Import]
public IFirstInterface firstImport;
[Import]
public ISecondInterface secondImport;
// ...
}
public class A : ISecondInterface {}
public class B : ISecondInterface {}
我希望能够在类栏中调用
var foo = compositionContainer.GetExportedValue<Foo>();
指定要使用A类还是b类。
我知道,我可以在getexporttedvalue方法中指定合约名称。但据我所知,这意味着有两个类Foo。我想重用相同的类,但要控制使用哪个类(A或B)来满足ISecondInterface依赖。
编辑:"决定你使用A类还是B类的规则是什么?"
:Foo由wcf服务调用。A类和B类的不同之处在于它们在不同的实体上工作。这些实体有不同的字段,不能以相同的方式查询。
我的课不是英语的,但我会尽量翻译成比Foo和Bar更有意义的术语。
Foo可以是一个RecordAssigner。RecordAssigner将记录分配给用户。这样做的逻辑包含在这个类中。ISecondInterface是与记录一起工作的数据层类的接口。
它的实现方法暴露工作在不同类型的记录。虽然这两种类型的记录都需要为它们分配必要的方法,但它们在数据级别上的操作是不同的。
在服务级别,我希望能够调用方法AssignRecordTypeA和AssignRecordTypeB,而不复制RecordAssigner中的所有代码
决定使用A类还是B类的规则是什么?您可以为MEF导出编写自己的解析器。
这个博客文章http://randomactsofcoding.blogspot.com/2010/01/configurable-type-catalog-for-mef.html提到了一种方法,如果你搜索"mef自定义导出提供者"或"mef自定义目录",你可以找到其他一些方法
编辑:你的情况让我想起了前阵子我和一些同事的谈话。在我看来,MEF是应用程序的"扩展",而不是依赖项。这种情况看起来更像是依赖关系。因此,最好使用IoC容器来管理依赖项。你可以用不同的键注入多个ISecondInterface实例,然后选择使用哪一个。
如果您觉得MEF更适合您的需求,您仍然可以通过更改
来执行此操作。public class Foo
{
[Import]
public IFirstInterface firstImport;
[ImportMany]
public Collection<ISecondInterface> secondImport;
// ...
}
,然后决定使用哪一个
话虽如此,让一个服务处理两个不同的实体与两个不同的存储库通信的情况是有争议的。如果你有一些共同的逻辑,你可以重构它,但最好有两个不同的服务,每个服务都有完成工作所需的依赖项。
我不能立即想到在MEF中做到这一点而不创建任何额外的类。我能想到的最好的办法是用不同的[Import]
规范创建Foo
的子类。