Добавление сервисов после сборки контейнера


87

Можно ли зарегистрировать сервис во время выполнения, то есть после того, как ContainerBuilderон был построен и Containerбыл создан (и удален ContainerBuilder)?


В настоящее время передовая практика гласит, что контейнеры AutoFac неизменяемы
Ади

Ответы:


96

Да, вы можете, используя Updateметод ContainerBuilder:

var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);

2
Обратите внимание, что обновление существующего контейнера, который уже использовался для разрешения, может привести к недетерминированному поведению. Например, замена компонентов, которые являются зависимостями уже разрешенных синглтонов, заставляет ссылаться на исходный компонент.
Стивен

13
Обновление устарело github.com/autofac/Autofac/issues/811 .
Чейз

19

Поскольку ContainerBuilder.Update устарел, новая рекомендация заключается в использовании дочерней области времени существования.

Добавление регистраций в жизненную область

Autofac позволяет добавлять регистрации «на лету» по мере создания пожизненных областей. Это может помочь вам, когда вам нужно выполнить своего рода переопределение ограниченной регистрации «точечной сваркой» или если вам обычно просто нужны некоторые дополнительные вещи в области, которую вы не хотите регистрировать глобально. Вы делаете это, передавая лямбду в BeginLifetimeScope (), которая принимает ContainerBuilder и добавляет регистрации.

using(var scope = container.BeginLifetimeScope(
  builder =>
  {
    builder.RegisterType<Override>().As<IService>();
    builder.RegisterModule<MyModule>();
  }))
{
  // The additional registrations will be available
  // only in this lifetime scope.
}

Работа с пожизненными областями действия


Следует отметить, что комментарий в блоке using. «Дополнительные регистрации будут доступны только в течение этого срока».
Ady
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.