#dependency-injection #prism #mef #catalog
#внедрение зависимостей #prism #mef #каталог
Вопрос:
В принципе, у меня есть следующий сценарий:
- Пользователь запускает приложение
- Загрузчик загружает каталог «Modules» в AggregateCatalog.
- Мое навигационное меню создано
- Пользователь нажимает обновить
- Приложение загружает новый модуль и копирует его в каталог модуля.
Мне каким-то образом нужно иметь возможность добавлять новый модуль в свой 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
интерфейс, поэтому убедитесь, что у вашего приложения нет проблем из-за этого.