2009-09-18 63 views
2

我是MEF的新手,我正在尝试使用它来构建插件系统,但我陷入了第一步。如何使用MEF导入多个插件/零件?

我正在关注article by Andrew Whitechapel。我已经下载了他的示例代码并且它运行正常(如果您删除了其中一个“导出”程序集 - 它们在他的示例中互斥)并引用MEF程序集)。

该示例说明了导入单个零件。我想导入多个部分(全部基于相同的界面)。所以,我改变了代码示例如下:

[Import] 
// OLD - public Interface.ICalculate Calculate { get; set; } 
public IEnumerable<Interface.ICalculate> Calculators { get; set; } 

// OLD - Console.WriteLine(
// OLD -  String.Format("{0}", Calculate.Circumference(4))); 
foreach (Interface.ICalculate calculator in Calculators) 
{ 
    Console.WriteLine(
    String.Format("{0}", calculator.Circumference(4))); 
} 

我还进口System.Collections.Generic为IEnumerable的。

关键的变化是第一个。据我所知,这将允许我从多个组件中导入零件。但是,我得到以下错误:

No valid exports were found that match the constraint 

在这一点上,我甚至没有添加多个“插件”程序集。仍然只有一个。

为了完整这里是他的出口定义(我没碰过)在“插件”类库:

[Export(typeof(Interface.ICalculate))] 
public class Calculate : Interface.ICalculate 

任何想法?我在这里挠头。我搜索了SO和MEF论坛,但可以找到任何启​​发我的东西。

我使用的是VS 2008 SP1(没有安装2010 beta)和最新的System.ComponentModel.Composition程序集(2009.26.8.0)。

回答

5

MEF Preview Release 5改变了这一点。现在,您需要使用ImportManyAttribute代替ImportAttribute的:

[ImportMany] 
public IEnumerable<Intertface.ICalculate> Calculators { get; set; } 

有关详细信息,请参阅announcement for PR5