Разница между DirectoryCatalog и AssemblyCatalog

У меня есть приложение MEF с довольно большим количеством компонентов в разных библиотеках. Когда программа запускается, я создаю AggregateCatalog, а затем загружаю в него все сборки. Из-за большого количества компонентов это может занять некоторое время и вызвать задержки при загрузке приложения. Я бы хотел отложить загрузку некоторых компонентов на потом, но я столкнулся с проблемой. Когда я загружаю компоненты, используя

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

Я получаю около 125 компонентов в каталоге, и все работает нормально. Когда я загружаю каждый dll и exe отдельно, используя AssemblyCatalog, я получаю только около 77 компонентов, и приложение не запускается из-за отсутствия компонентов. Я даже создал список каталогов и перебрал его, чтобы не пропустить ни одного файла и получить тот же результат. У меня вопрос: что еще делает DirectoryCatalog, который позволяет всем работать должным образом и как я могу эмулировать его, не загружая все в каталог сразу?

1 ответ

Решение

Разница между AssemblyCatalog и DirectoryCatalog

Я скачал исходный код MEF из CodePlex ( ссылка). Глядя на DirectoryCatalog.cs, он создает словарь Dictionary () из 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(s), поскольку это именно то, что в любом случае делает DirectoryCatalog,

Возможно ли, что в вашем коде есть ошибка, которая создает новый AssemblyCatalog для каждой сборки?

Я также посмотрел на AssemblyCatalog, который просто загружает сборку, а затем получает все ее тип.

Проблемы с производительностью

Я бы хотел отложить загрузку некоторых компонентов на потом

Если ваша проблема со скоростью возникает просто при создании ваших каталогов, этот следующий бит не поможет. В противном случае, если проблема с производительностью возникает при создании деталей, вместо манипулирования собой с помощью AssemblyCatalogs используйте MEF Lazy Imports / Exports ( Другая ссылка). Когда MEF обычно составляет части, он создает экземпляр всех импортов и всех дочерних импортов. Если вы определили их как Lazy MEF, они не будут создавать экземпляры этих типов / частей, пока они не потребуются (что экономит время).

Другие вопросы по тегам