为什么MEF的出口增长如此之慢?

时间:2015-05-10 14:48:21

标签: c# plugins mef composition

我按如下方式创建MEF容器:

        //Compose Plugins
        var aggregateCatalog = new AggregateCatalog();

        IEnumerable<string> directories = FileIO.GetAllSubDirectories(PluginRootDirectory);
        foreach (string directory in directories)
        {
            var catalog = new DirectoryCatalog(directory);
            aggregateCatalog.Catalogs.Add(catalog);
        }

        Container = new CompositionContainer(aggregateCatalog);
        Container.ComposeParts(Container);

然后我尝试按如下方式获得出口:

    public Dictionary<string, T> GetPlugins<T>()
    {
        var exports = Container.GetExports<T, IPluginAttribute>();
        return exports.ToDictionary(i => i.Metadata.PluginName, i => i.Value);
    }
  • 第一个代码段在构造函数中执行。
  • 第二个代码段请求特定类型的插件,并且始终在第一个代码剪切执行后执行。
  • 第一次执行第二个代码片段需要很长时间;但是,后续请求运行得很快。

问题:如何在请求导出/插件之前确保容器已组成?我甚至想要第一个请求GetPlugins<T>()快速运行。我可以忍受较长的初始化时间,但现在似乎容器的组成被延迟,直到实际请求导出的插件。

1 个答案:

答案 0 :(得分:2)

如果有许多文件要通过目录编目解析,MEF会花费时间。它将尝试解析目录中的所有binares,无论是托管还是非托管。

它也会缓存未标记为Export的类,因为MEF允许您按名称导入类,即使它们没有Export属性。

尝试在空白类中只使用单个虚拟dll来查看问题是否包含太多文件或MEF。