我有一个MEF应用程序,在不同的dll中有相当多的组件。程序启动时,我创建了一个AggregateCatalog,然后将所有程序集加载到其中。由于组件数量众多,这可能需要一些时间并导致加载应用程序的延迟。我想延迟一些组件加载直到稍后,但我遇到了一个问题。当我使用
加载组件时this.AggregateCatalog.Catalogs.Add(new DirectoryCatalog("."));
我在目录中获得了大约125个组件,一切运行正常。当我使用AssemblyCatalog单独加载每个dll和exe时,我只得到大约77个组件,并且由于缺少组件,应用程序无法运行。我甚至创建了一个目录列表并通过它循环,这样我就不会错过任何文件并得出相同的结果。我的问题是,DirectoryCatalog还做了什么让一切正常工作,如何在不加载目录中的所有内容的情况下模拟它?
答案 0 :(得分:2)
AssemblyCatalog和DirectoryCatalog之间的区别
我从CodePlex(link)下载了MEF源代码。通过查看DirectoryCatalog.cs,它创建了一个字典Dictionary<对于AssemblyCatalogs的字符串,AssemblyCatalog>(),它找到的每个程序集都有一个。
this._assemblyCatalogs = new Dictionary<string, AssemblyCatalog>();
this._catalogCollection = new ComposablePartCatalogCollection(null, null, null);
this._loadedFiles = GetFiles().ToReadOnlyCollection();
foreach (string file in this._loadedFiles)
{
AssemblyCatalog assemblyCatalog = null;
assemblyCatalog = CreateAssemblyCatalogGuarded(file);
if (assemblyCatalog != null)
{
this._assemblyCatalogs.Add(file, assemblyCatalog);
this._catalogCollection.Add(assemblyCatalog);
}
}
正如您在此处所看到的,它使用GetFiles()获取指定目录中的所有程序集(如果未定义可选搜索模式,则会获取所有文件)。然后,它为每个程序集创建一个新的程序集目录。
CreateAssemblyCatalogGuarded为例外添加防护。
据我所知,使用DirectoryCatalog(这是我喜欢的方式)和使用单独的AssemblyCatalog加载所述目录中的所有程序集之间应该没有任何区别,因为这正是无论如何,DirectoryCatalog都会这样做。
您的代码中是否存在为每个程序集创建新AssemblyCatalog的错误?
我还查看了AssemblyCatalog,它只是加载一个Assembly,然后得到它的所有类型。
效果问题
我想延迟一些组件加载,直到稍后
如果仅通过创建目录来解决速度问题,则以下位将无济于事。否则,如果在编写零件时发生性能问题,而不是使用AssemblyCatalog来处理自己,请使用MEF Lazy Imports/Exports(Another link)。当MEF通常组成零件时,它将创建所有Imports和所有子进口的实例。如果您将它们定义为Lazy MEF,则在需要之前不会创建这些类型/部件的实例(这样可以节省时间)。