Контейнеры обычно следует считать неизменяемыми. Зарегистрируйте все ваши зависимости перед построением / разрешением. Если вам нужно изменить содержимое контейнера, технически вам следует перестроить контейнер. Этот метод может быть удален в будущем основной версии.

емя обсуждения Autofac с коллегой возникла проблема регистрации зависимостей во время выполнения. Например, в Prism сборки часто загружаются во время выполнения, а их зависимости регистрируются в контейнере IoC (обычно Unity).

Как это можно сделать с помощью Autofac?

Из документации Autofac и того, что я нашел в Интернете, кажется, что регистрация выполняется при запуске приложения. Даже когда используются «внешние» сборки, регистрации располагаются в модулях со сборками при запуске приложения. Как мы это делаем после того, как контейнер «собран» при запуске приложения?

(Обратите внимание, что сборка может захотеть добавить зависимости для использования других компонентов в приложении, и поэтому вложенный контейнер может не решить проблему здесь. Связанный с этим разделом: Unity имеет методы, такие как RegisterIfExists и тому подобное. Есть ли Autofac эквиваленты?)

Спасибо!

 Jim G.06 июн. 2013 г., 17:39

Ответы на вопрос(2)

Решение Вопроса

Обновить существующий контейнер Autofac: Вы можете обновить существующий AutofacContainer во время выполнения с помощьюContainerBuilder.Update(), Следующий пример кода, взятый из поста блогаAutofac 2.2 выпущен, демонстрирует использование:


var updater = new ContainerBuilder();
updater.RegisterType<A>();
updater.Register(c => new B()).As<IB>();

// Add the registrations to the container
updater.Update(container);

Аутофак и Призма Интеграция: ВопросКаков статус интеграции Prism в Autofac? также может быть полезным для вас.

 Mark Richman05 февр. 2015 г., 17:26
Знаете ли вы, возможно ли сделать это, используя типы из динамически загружаемой сборки? То есть я используюAssembly.LoadFrom() а затем обновить контейнер с недавно обнаруженными типами?
 bentayloruk07 февр. 2015 г., 17:37
Один изRegisterType перегрузки занимаетType Например, если у вас есть, что вы должны быть в порядке.
 Oğuzhan Soykan03 окт. 2016 г., 22:50
Update() Команда может использовать только один раз. Это не эффективно для регистрации во время выполнения. Мне нужно зарегистрировать новые типы после.Build() операция, если это возможно ...

Обновление для Autofac 4.8.1.0

ContainerBuilder.Update метод помечен какObsolete с комментарием:
Контейнеры обычно следует считать неизменяемыми. Зарегистрируйте все ваши зависимости перед построением / разрешением. Если вам нужно изменить содержимое контейнера, технически вам следует перестроить контейнер. Этот метод может быть удален в будущем основной версии.

Ваш ответ на вопрос