服务定位器:获取所有出口

时间:2013-12-08 09:44:40

标签: c# mef service-locator

我正在使用 MEF 并且我有两个具有相同合同类型但具有不同合同名称的出口

例如:

[Export("TypeA", typeof(MyPlugin))]
[Export("TypeB", typeof(MyPlugin))]

我可以使用各自的合同名称检索每个导出:

ServiceLocator.GetExportedValues<MyPlugin>("TypeA");

但现在我希望检索实现MyPlugin的所有实例。有什么方法可以做到吗?

我尝试使用以下代码:

ServiceLocator.GetExportedValues<MyPlugin>();

但它没有用。显然,它仅用于检索没有特定合同名称的实现。

有什么意见吗?

3 个答案:

答案 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)

您可以使用强类型元数据导出。

  1. 创建从ExportAttribute继承的自定义属性,该属性从接口实现。
  2. 使用此自定义属性而不是导出。
  3. 您可以使用“导入”获取所需类型。

    [ImportMany]
    public IEnumerable<Lazy<YourType,IMetadataAttribute>> Plugins{get;private set;}
    

    您可以从MEF Documentation

    获取更多信息

答案 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;