Регистрация времени работы с Autofac
Обсуждая Autofac с коллегой, возникла проблема регистрации зависимостей во время выполнения. В Prism, например, сборки часто загружаются во время выполнения и их зависимости, зарегистрированные в контейнере IoC (обычно Unity).
Как это можно сделать с помощью Autofac?
Из документации Autofac и того, что я нашел в Интернете, кажется, что регистрация выполняется при запуске приложения. Даже когда используются "внешние" сборки, регистрации размещаются в модулях со сборками при запуске приложения. Как это сделать после того, как контейнер "построен" при запуске приложения?
(Обратите внимание, что сборка может захотеть добавить зависимости для использования других компонентов в приложении, и поэтому вложенный контейнер может не решить проблему здесь. В связи с этим вопросом: Unity имеет такие методы, как RegisterIfExists и т.п. Существуют ли автофокусные эквиваленты?)
Спасибо!
Ответы
Ответ 1
Обновить существующий контейнер Autofac. Вы можете обновить существующий Autofac Container
во время выполнения, используя ContainerBuilder.Update()
. Следующий пример кода, взятый из сообщения блога Autofac 2.2 Released, демонстрирует использование:
var container = // something already built
var updater = new ContainerBuilder();
updater.RegisterType<A>();
updater.Register(c => new B()).As<IB>();
// Add the registrations to the container
updater.Update(container);
Интеграция Autofac и Prism: вопрос Какой статус интеграции Prism в Autofac? также может быть вам полезен.
Ответ 2
Обновление для Autofac 4.8.1.0
Метод ContainerBuilder.Update
помечен как "Устаревший" с комментарием: Контейнеры обычно считаются неизменяемыми. Зарегистрируйте все свои зависимости до создания/разрешения. Если вам нужно изменить содержимое контейнера, вы технически должны перестроить контейнер. Этот метод может быть удален в будущем выпуске.