我正在使用 MEF 并且我有两个具有相同合同类型但具有不同合同名称的出口
例如:
[Export("TypeA", typeof(MyPlugin))]
[Export("TypeB", typeof(MyPlugin))]
我可以使用各自的合同名称检索每个导出:
ServiceLocator.GetExportedValues<MyPlugin>("TypeA");
但现在我希望检索实现MyPlugin
的所有实例。有什么方法可以做到吗?
我尝试使用以下代码:
ServiceLocator.GetExportedValues<MyPlugin>();
但它没有用。显然,它仅用于检索没有特定合同名称的实现。
有什么意见吗?
答案 0 :(得分:4)
如果您希望它可以双向解析,我只需在每个命名导出旁边添加无名导出。例如
// named and nameless
[Export("TypeA", typeof(MyPlugin))]
[Export(typeof(MyPlugin))]
// named nameless, again
[Export("TypeB", typeof(MyPlugin))]
[Export(typeof(MyPlugin))]
class MyPlugin { }
[TestMethod]
public void mef()
{
var catalog = new AssemblyCatalog(this.GetType().Assembly);
var container = new CompositionContainer(catalog);
Assert.AreEqual(2, container.GetExportedValues<MyPlugin>().Count());
}
答案 1 :(得分:0)
您可以使用强类型元数据导出。
您可以使用“导入”获取所需类型。
[ImportMany]
public IEnumerable<Lazy<YourType,IMetadataAttribute>> Plugins{get;private set;}
获取更多信息
答案 2 :(得分:0)
声明两种类型的Export
[Export(typeof(IFoo)),Export("TypeA", typeof(IFoo))]
public class Foo1 : IFoo { }
[Export(typeof(IFoo)),Export("TypeB", typeof(IFoo))]
public class Foo2 : IFoo { }
使用ImportMany
[ImportMany]
IFoo[] foos;