c# - MEF Composition ImportMany 产生同一类的两个版本

标签 c# .net mef

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


...

    [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 的方式有关吗?我对任何想法持开放态度。

最佳答案

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

关于c# - MEF Composition ImportMany 产生同一类的两个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078821/

相关文章:

c# - 从 Roslyn SyntaxRewriter 中修改后的 SyntaxNode 访问 SymbolInfo

c# - 从 Ubuntu 中的其他 C# 服务访问自签名 HTTPS C# 服务

c# - 我的 wpf 动画代码有什么问题

c# - 如何根据某些参数加载不同的 RESX 文件

wpf - 手动设置 MainWindow 和编写应用程序 (MEF) 时无法显示 WPF 应用程序

C# volatile double

c# - 使用 XSD.exe 时如何指定属性名称?

c# - DateTime.ToString 问题

C# - MEF - 从可移植类库导入

c# - MEF 导入 null