Hinzufügen von Diensten nach dem Erstellen eines Containers

86

Ist es möglich , einen Dienst zur Laufzeit registrieren, nachdem das heißt die ContainerBuildergebaut wurde und das Containererstellt wurde (und ContainerBuilderentsorgt)?

Paul Knopf
quelle
Derzeit sagen Best Practices, dass AutoFac-Container unveränderlich sind
Ady

Antworten:

96

Ja, Sie können mit der folgenden UpdateMethode ContainerBuilder:

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

newBuilder.Update(existingContainer);
Peter Lillevold
quelle
1
Beachten Sie, dass das Aktualisieren eines vorhandenen Containers, der bereits zum Auflösen verwendet wurde, zu einem unbestimmten Verhalten führen kann. Wenn Sie beispielsweise Komponenten ersetzen, die Abhängigkeiten von bereits aufgelösten Singletons sind, bleibt die ursprüngliche Komponente referenziert.
Steven
12
Das Update ist veraltet. Github.com/autofac/Autofac/issues/811 .
Chase Florell
16

Da ContainerBuilder.Update veraltet ist, wird empfohlen, den Bereich für die untergeordnete Lebensdauer zu verwenden.

Hinzufügen von Registrierungen zu einem lebenslangen Bereich

Mit Autofac können Sie Registrierungen "on the fly" hinzufügen, während Sie lebenslange Bereiche erstellen. Dies kann Ihnen helfen, wenn Sie eine Art eingeschränkte Registrierungsüberschreibung für Punktschweißungen durchführen müssen oder wenn Sie im Allgemeinen nur einige zusätzliche Dinge in einem Bereich benötigen, den Sie nicht global registrieren möchten. Dazu übergeben Sie ein Lambda an BeginLifetimeScope (), das einen ContainerBuilder verwendet und Registrierungen hinzufügt.

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

Arbeiten mit Lebensbereichen

wezzix
quelle
Zu beachten ist der Kommentar im using-Block. "Die zusätzlichen Registrierungen sind nur in diesem lebenslangen Bereich verfügbar."
Ady