2

我一直无法为我的问题找到答案。我正在使用 MEF 来查找和创建实现 IPlugIn 的类,但我最终得到了每个 PlugIn 类的两个版本。我已确定 AggregateCatalog 仅包含一个程序集,该程序集仅包含每个类的一种类型作为部件,但我仍然得到每个类的两个实例作为最终结果。我可能只是在做一些愚蠢的事情,但我还没有找到它。我将不胜感激任何帮助...

...

    [ImportMany(typeof(IPlugIn))]
     公共 System.Lazy>[] 插件 { 获取;放; }

...
    //aggregatecatalog 只包含一个包含插件类的 dll,其中 4 个
    容器 = 新组合容器(聚合目录,
                                         CompositionOptions.DisableSilentRejection
                                         | CompositionOptions.IsThreadSafe);\

    container.SatisfyImportsOnce(this);

    ...
    公共无效开始所有()
    {
    //我们这里有8个插件??如何?
    if (Plugins == null || Plugins.Count() == 0)
    {

       log.Warn("没有可启动的插件!");
       返回;
    }

        foreach(插件中的 var 插件)
        {
            log.Info("启动插件:" + plug.Value.GetName());
            plug.Value.Start();
        }
    }

   ...

    [导出(类型(IPlugIn))]
    公共类 MyPlugIn : BasePlugIn, IPlugIn

    ...

我在 Visual Studio 中调试。我清楚地看到只有一个程序集加载。CompositionContainer 每个只有 1 个。在 StartAll() 中的 SatisfyImportOnce 之后,我有每个 IPlugIn 类的两个实例。这与我使用 ImportMany 的方式有关吗?我对任何想法持开放态度。

4

2 回答 2

3

解决方案很简单。我从 IPlugIn 接口中完全删除了 [InheritedExport],并创建了正确数量的插件。如果我从每个 PlugIn 子类中删除 [Export... ,我根本没有插件。正是这两者的结合创造了多个实例。

于 2012-11-12T20:03:21.483 回答
2

如果您InheritedExport的接口上有一个属性,则必须InheritedExport在实现该接口的类上使用一个属性。应用Export结果将组成一个额外的部分,这就是你发现的。

此外,如果您想将任何其他应用ExportMetadata到实现接口的类,则InheritedExport必须再次InheritedExport添加该属性以添加元数据(替换继承的元数据,即使没有)。InheritedExportExportMetadata的 MSDN 文档中没有解决此问题,但我在其他晦涩的 Microsoft 文档中遇到了一些模糊的引用。

于 2014-12-02T15:14:54.287 回答