代码之家  ›  专栏  ›  技术社区  ›  dommer

如何使用MEF导入多个插件/部件?

  •  2
  • dommer  · 技术社区  · 15 年前

    我对MEF不熟悉,正试图用它来构建一个插件系统,但却一直停留在第一步。

    我在跟踪一个 article by Andrew Whitechapel . 我已经下载了他的示例代码an it runs ok(如果您删除其中一个“导出”程序集-它们在他的示例中是互斥的-并引用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)));
    }
    

    我还为IEnumerable导入了System.Collections.Generic。

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

    No valid exports were found that match the constraint
    

    此时,我甚至没有添加多个“插件”程序集。还有一个。

    为了完整起见,这里是“插件”类库中的他的导出定义(我没有接触过):

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

    有什么想法吗?我在这里抓头。我已经搜索过So和MEF论坛,但能找到任何能启发我的东西。

    我使用的是vs 2008 SP1(没有安装2010测试版)和最新的system.componentModel.composition程序集(2009.26.8.0)。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Reed Copsey    15 年前

    MEF预览版本5更改了这一点。现在您需要使用importmanyattribute而不是importattribute:

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

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