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

use*_*346 6 c# mef service-locator

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

例如:

[Export("TypeA", typeof(MyPlugin))]
[Export("TypeB", typeof(MyPlugin))]
Run Code Online (Sandbox Code Playgroud)

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

ServiceLocator.GetExportedValues<MyPlugin>("TypeA");
Run Code Online (Sandbox Code Playgroud)

但现在我希望检索所有实现的实例MyPlugin.有什么办法可以吗?

我尝试使用以下代码:

ServiceLocator.GetExportedValues<MyPlugin>();
Run Code Online (Sandbox Code Playgroud)

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

任何意见?

def*_*mer 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());
}
Run Code Online (Sandbox Code Playgroud)