Регистрация времени работы с 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 помечен как "Устаревший" с комментарием: Контейнеры обычно считаются неизменяемыми. Зарегистрируйте все свои зависимости до создания/разрешения. Если вам нужно изменить содержимое контейнера, вы технически должны перестроить контейнер. Этот метод может быть удален в будущем выпуске.