使用MEF导入多个实例

7
我正在导出一些实现IFoo接口的类,代码如下:
public interface IFoo { }

[Export("A", typeof(IFoo))]
public class Foo1 : IFoo { }

[Export("B", typeof(IFoo))]
public class Foo2 : IFoo { }

当我尝试使用以下方式导入其中一个时:

 containter.GetExportedValue<IFoo>("A"); 

它的功能很好,但当我尝试像这样导入所有内容时。
[ImportMany]
IFoo[] foos;

它不起作用。

有人可以告诉我如何解决这个问题吗?


问题 - foos是否不应该是一个具有get; set;的属性? - labroo
2个回答

9

要同时拥有这两种方式,需要声明2个导出项:

public interface IFoo { }

[Export(typeof(IFoo))]
[Export("A", typeof(IFoo))]
public class Foo1 : IFoo { }

[Export(typeof(IFoo))]
[Export("B", typeof(IFoo))]
public class Foo2 : IFoo { }

那么它应该可以工作(我进行了测试样例并使其工作)。

希望对你有所帮助,

Bab。


嗨@Baboon,我认为使用[Export(string, Type)]可以同时进行两个导出。 - Michelle
这个非常好用。而且,如果你在导出中省略了一个名称,它就会成为默认值,这对于避免某些类型的循环依赖非常有用。 - Contango
有没有一种方法可以同时使用[ImportMany]并获得合同名称? - Stijn Tallon

3

移除你的出口中的合同名称。

[Export("A", typeof(IFoo))]

To

[Export(typeof(IFoo))]

在第一种情况下,您正在导出名称为“A”且类型为IFoo的合同,而在您的导入中,您正在导入与IFoo类型的所有合同(没有合同名称),因此不考虑具有合同名称的导出。
正如baboon所提到的,您可以两全其美。您应该考虑是否需要在应用程序中同时使用它们,如果不是这种情况,我建议只使用一种方法以尽可能简单地保持事情的简单性,否则建议使用他的方法。

1
是的,但那样他就不能再单独导入“A”了。 - Louis Kottmann
@Baboon:我想知道在这种情况下是否有可能导出带有和不带有合同的部分,以利用两种类型的导入。但我不确定在这种情况下是否真的有必要。 - Gilles
嗨,@Gilles,Baboon是对的,我需要使用双向导入它们。 - Michelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接