2012-03-09 76 views
7

许多情况下,我出口一些类实现的IFoo接口这样导入使用MEF

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; 

这是行不通的。

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

+0

问题 - 应该foos不是一个得到财产;组; ? – labroo 2012-03-09 17:50:16

回答

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 { } 

那么它应该工作(我做了一个测试样本,得到它的工作)。

HTH,

Bab。

+0

嗨@Baboon,我认为使用[Export(string,Type)]会同时导出。 – Michelle 2012-03-09 18:41:32

+0

这工作很好。另外,如果您忽略其中一个导出的名称,这将成为默认值,这对避开某些类型的循环依赖非常有用。 – Contango 2013-10-21 12:49:32

+0

有没有一种方法可以做[ImportMany],仍然可以得到合同名称? – 2015-06-01 11:24:08

3

删除您的出口合同名称。

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

[Export(typeof(IFoo))] 

在第一种情况要导出的名称相匹配“A”和类型的IFoo,而在你的导入许多要导入的合同相匹配的一切合同键入IFoo(无合同名称),因此不考虑带合同名称的导出。

正如狒狒提到的,你可以拥有它。你应该考虑你是否需要在你的应用程序中,如果不是这样,我会坚持只有一种方法来尽可能简单,否则我建议使用他的方法。

+1

是的,但他不能再导入“A”了。 – 2012-03-09 17:51:31

+0

@Baboon:我想知道在这种情况下是否可以导出带有和没有合同的零件来使用这两种类型的导入。但我不知道在这种情况下是否真的有必要。 – Gilles 2012-03-09 17:58:01

+0

Hi @Gilles,狒狒是对的我需要用这两种方式导入它们。 – Michelle 2012-03-09 19:00:01