我没有找到解决我问题的答案。我正在使用MEF查找和创建实现IPlugIn的类,但最终每个插件类都有两个版本。我确定AggregateCatalog仅包含一个Assembly,而每个Part只包含1种类型的零件,但是最终结果仍然是每种的两个实例。我可能只是在做一些愚蠢的事情,但还没有发现。我将不胜感激...


...

    [ImportMany(typeof(IPlugIn))]
     public System.Lazy> []插件{get;组; }

...
    // aggregatecatalog仅包含一个包含插件类的dll,其中有4个
    容器=新的CompositionContainer(aggregateCatalog,
                                         CompositionOptions.DisableSilentRejection
                                         | CompositionOptions.IsThreadSafe); \

    container.SatisfyImportsOnce(this);

    ...
    公共无效StartAll()
    {
    //我们这里有8个插件??怎么样?
    如果(插件== null || Plugins.Count()== 0)
    {

       log.Warn(“无插件可启动!”);
       返回;
    }

        foreach(var插件插件)
        {
            log.Info(“ Starting PlugIn:” + plug.Value.GetName());
            plug.Value.Start();
        }
    }

   ...

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

    ...



我正在Visual Studio中进行调试。我清楚地看到只有一个程序集正在加载。 CompositionContainer仅有一个。在StartAll()中满足SatisfyImportOnce之后,每个IPlugIn类都有两个实例。这与我使用ImportMany的方式有关吗?我愿意接受任何想法。

最佳答案

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

10-02 14:51