Dodawanie usług po zbudowaniu kontenera


89

Czy można zarejestrować usługę w czasie wykonywania, czyli po ContainerBuilderzbudowaniu i Containerutworzeniu (i usunięciu ContainerBuilder) usługi?


Obecnie najlepsze praktyki mówią, że kontenery AutoFac są niezmienne
Ady

Odpowiedzi:


96

Tak, możesz, korzystając z Updatemetody na ContainerBuilder:

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

newBuilder.Update(existingContainer);

2
Zwróć uwagę, że aktualizacja istniejącego kontenera, który został już użyty do rozwiązania, może spowodować nieokreślone zachowanie. Na przykład zastąpienie komponentów, które są zależnościami już rozwiązanych singletonów, powoduje, że oryginalny komponent pozostaje przywoływany.
Steven

13
Aktualizacja jest przestarzała github.com/autofac/Autofac/issues/811 .
Chase Florell

20

Ponieważ ContainerBuilder.Update został przestarzały, nowe zalecenie polega na użyciu podrzędnego zakresu życia.

Dodawanie rejestracji do zakresu dożywotniego

Autofac umożliwia dodawanie rejestracji „w locie” podczas tworzenia zakresów dożywotnich. Może ci to pomóc, gdy musisz zrobić coś w rodzaju „zgrzewania punktowego” nadpisania ograniczonej rejestracji lub jeśli generalnie potrzebujesz tylko dodatkowych rzeczy w zakresie, którego nie chcesz rejestrować globalnie. Robisz to, przekazując lambdę do BeginLifetimeScope (), która pobiera ContainerBuilder i dodaje rejestracje.

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.
}

Praca z dożywotnimi zakresami


Należy zwrócić uwagę na ten komentarz w bloku using. „Dodatkowe rejestracje będą dostępne tylko w tym okresie życia”.
Ady
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.