4

我有一个 MEF 应用程序,在不同的 dll 中有相当多的组件。当程序启动时,我创建了一个 AggregateCatalog,然后将所有程序集加载到其中。由于组件数量众多,这可能需要一些时间并导致应用程序加载延迟。我想将一些组件加载延迟到以后,但我遇到了问题。当我使用加载组件时

this.AggregateCatalog.Catalogs.Add(new DirectoryCatalog("."));

我在目录中获得了大约 125 个组件,一切运行良好。当我使用 AssemblyCatalog 单独加载每个 dll 和 exe 时,我只得到大约 77 个组件,并且由于缺少组件,应用程序无法运行。我什至创建了一个目录列表并循环访问它,这样我就不会错过任何文件并得出相同的结果。我的问题是,DirectoryCatalog 还能做什么来让一切正常工作,我如何在不一次将所有内容加载到目录中的情况下模拟它?

4

1 回答 1

3

AssemblyCatalog 和 DirectoryCatalog 之间的区别

我已经从 CodePlex (链接) 下载了 MEF 源代码。通过查看 DirectoryCatalog.cs,它创建了一个字典 Dictionary < string, AssemblyCatalog >() of AssemblyCatalogs,它对应于它找到的每个程序集。

    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 无论如何.

您的代码中是否有可能为每个 Assembly 创建一个新的 AssemblyCatalog 错误?

我还查看了AssemblyCatalog,它只加载一个Assembly,然后获取它的所有类型。

性能问题

我想将一些组件加载延迟到以后

如果您的速度问题只是通过创建目录而发生,那么以下内容将无济于事。否则,如果您在编写零件时出现性能问题,请使用MEF Lazy Imports/Exports另一个链接),而不是使用 AssemblyCatalogs。当 MEF 正常组合部件时,它会创建所有 Imports 和所有子导入的实例。如果您将它们定义为 Lazy MEF,则在需要它们之前不会创建这些类型/部分的实例(这样可以节省时间)。

于 2012-04-10T20:42:33.543 回答