2009-09-18 70 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