我按如下方式创建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>()
快速运行。我可以忍受较长的初始化时间,但现在似乎容器的组成被延迟,直到实际请求导出的插件。
答案 0 :(得分:2)
如果有许多文件要通过目录编目解析,MEF会花费时间。它将尝试解析目录中的所有binares,无论是托管还是非托管。
它也会缓存未标记为Export的类,因为MEF允许您按名称导入类,即使它们没有Export属性。
尝试在空白类中只使用单个虚拟dll来查看问题是否包含太多文件或MEF。