MEF组合ImportMany产生同一类的两个版本

时间:2012-10-25 23:27:46

标签: c# .net mef

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


...

    [ImportMany(typeof(IPlugIn))]
     public System.Lazy>[] Plugins { get; set; }

...
    //aggregatecatalog only contains one dll containing plugin classes, 4 of them
    container = new CompositionContainer(aggregateCatalog,
                                         CompositionOptions.DisableSilentRejection 
                                         | CompositionOptions.IsThreadSafe);\

    container.SatisfyImportsOnce(this);

    ...
    public void StartAll()
    {
    //We have 8 PlugIns here?? How? 
    if (Plugins == null || Plugins.Count() == 0)
    {

       log.Warn("No PlugIns Available to Start!");
       return;
    }

        foreach (var plug in Plugins)
        {
            log.Info("Starting PlugIn: " + plug.Value.GetName());
            plug.Value.Start();
        }
    }

   ...

    [Export(typeof(IPlugIn))]
    public class MyPlugIn : BasePlugIn, IPlugIn

    ...

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果您的界面上有InheritedExport属性,则必须在实现该界面的类上使用InheritedExport。应用Export会导致组成一个额外的部分,这是您发现的。

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