Додавання послуг після побудови контейнера


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. "Додаткові реєстрації будуть доступні лише у цьому терміні дії".
Аді,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.