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)?


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);

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

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


Zu beachten ist der Kommentar im using-Block. "Die zusätzlichen Registrierungen sind nur in diesem lebenslangen Bereich verfügbar."
Ady
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.