为什么在 MEF 中获取导出这么慢?
Why is getting Exports in MEF so slow?
我创建一个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);
}
- 第一个代码片段在构造函数中执行。
- 第二个代码片段请求特定类型的插件,并且总是在第一个代码片段执行后执行。
- 第一次执行第二个代码片段需要很长时间;但是,后续请求 运行 很快。
问题:如何确保在请求 exports/plugins 之前容器已组合?我什至希望第一个请求 GetPlugins<T>()
到 运行 快。我可以忍受更长的初始化时间,但现在看来容器的组成被延迟,直到实际请求导出的插件。
如果有很多文件要通过目录解析,MEF 会花费一些时间catalog.It 将尝试解析目录中的所有二进制文件,无论是托管的还是非托管的。
它还会缓存未标记为导出的 class,因为 MEF 允许您按名称导入 classes,即使它们没有导出属性。
尝试只有一个虚拟 dll 和空白 classes 以查看问题是否与文件或 MEF 过多有关。
我创建一个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);
}
- 第一个代码片段在构造函数中执行。
- 第二个代码片段请求特定类型的插件,并且总是在第一个代码片段执行后执行。
- 第一次执行第二个代码片段需要很长时间;但是,后续请求 运行 很快。
问题:如何确保在请求 exports/plugins 之前容器已组合?我什至希望第一个请求 GetPlugins<T>()
到 运行 快。我可以忍受更长的初始化时间,但现在看来容器的组成被延迟,直到实际请求导出的插件。
如果有很多文件要通过目录解析,MEF 会花费一些时间catalog.It 将尝试解析目录中的所有二进制文件,无论是托管的还是非托管的。
它还会缓存未标记为导出的 class,因为 MEF 允许您按名称导入 classes,即使它们没有导出属性。
尝试只有一个虚拟 dll 和空白 classes 以查看问题是否与文件或 MEF 过多有关。