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?

Paul Knopf
źródło
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);
Peter Lillevold
źródło
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

wezzix
źródło
Należy zwrócić uwagę na ten komentarz w bloku using. „Dodatkowe rejestracje będą dostępne tylko w tym okresie życia”.
Ady