关于C#:mef composition importmany生成同一类的两个版本

MEF Composition ImportMany yield two versions of same class

我找不到我问题的答案。我正在使用MEF来查找和创建实现IPlugin的类,但最终每个插件类有两个版本。我已经确定AggregateCatalog只包含一个程序集,该程序集只包含作为一部分的每个类的一种类型,但是作为最终结果,我仍然得到每个类的两个实例。我可能只是做了件蠢事,但我还没找到。如果有任何帮助…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
...

    [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中调试。我清楚地看到只有一个组件加载。复合容器每个只有1个。在startall()中满足importance之后,每个iplugin类都有两个实例。这是我使用importmany的方式吗?我愿意接受任何想法。


解决办法很简单。我完全删除了iplugin接口中的[inheriteexport],这创建了正确数量的插件。如果我删除了[导出…从每个插件子类中,我根本没有插件。创建多个实例的是这两个实例的组合。


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

此外,如果要将任何其他ExportMetadata应用于实现与InheritedExport接口的类,则必须再次添加InheritedExport属性,以便添加元数据(替换继承的元数据,即使没有元数据)。对于inheritedexport或exportmetadata,这在msdn文档中没有提到,但是我在其他模糊的Microsoft文档中遇到了一些模糊的引用。