Prism / MEF — Как только мое приложение будет запущено, как мне добавить в свой каталог AggregateCatalog позже?

#dependency-injection #prism #mef #catalog

#внедрение зависимостей #prism #mef #каталог

Вопрос:

В принципе, у меня есть следующий сценарий:

  1. Пользователь запускает приложение
  2. Загрузчик загружает каталог «Modules» в AggregateCatalog.
  3. Мое навигационное меню создано
  4. Пользователь нажимает обновить
  5. Приложение загружает новый модуль и копирует его в каталог модуля.

Мне каким-то образом нужно иметь возможность добавлять новый модуль в свой AggregateCatalog и обновлять мое навигационное меню. Я полагаю, что «Разрешить повторную компоновку» необходимо, но как мне на самом деле добавить новую сборку в мой AggregateCatalog после того, как мое приложение уже запущено?

Ответ №1:

Если вы импортируете каталог AggregateCatalog, вы можете получить к нему доступ из своей ViewModel (или откуда угодно еще, что вы хотите добавить к нему.

 [Import()]
private AggregateCatalog _aggregateCatalog;

...

private void SomeFunc()
{
    _aggregateCatalog.Catalogs.Add(...);
}
  


ПРИМЕЧАНИЕ: Если сборка повлияет на какие-либо инструкции Import или ImportMany, они должны допускать повторную компоновку, иначе вы получите исключение. Например, если ваша сборка содержит другой IFooService экспорт…

 //Exception Thrown
[ImportMany(typeof(IFooService))]
private IEnumerable<IFooService> _myFooServices;

//No Exception Thrown
[ImportMany(typeof(IFooService), AllowRecomposition = true)]
private IEnumerable<IFooService> _myFooServices;
  


ПРИМЕЧАНИЕ: Вы запустите его, OnImportsSatisfied если вы снова внедрили IPartImportsSatisfiedNotification интерфейс, поэтому убедитесь, что у вашего приложения нет проблем из-за этого.