.NET Core / EF 6 - Bereich der Abhängigkeitsinjektion

8

Ich arbeite zur Zeit an der Einrichtung einer .NET Core-Anwendung mit EF 6 und habe Probleme, die geeignete Verwendung der verschiedenen Abhängigkeitsregistrierungsmethoden zu verstehen. So wie ich es verstehe:

  • Transient : Das Objekt wird bei Bedarf erstellt (d. h. bei jeder Anforderung wird eine neue Instanz erstellt)
  • Singleton : Einzelne Instanz, die beim Start der Anwendung erstellt wird und für alle folgenden Anforderungen verfügbar ist
  • Bereich: : Verfügbar für die Dauer einer Anfrage

Speziell in meiner Situation habe ich ein Paar von DbContexts (basierend auf dem CQRS-Muster) eingerichtet, um Datenbankabfragen / Befehle zu behandeln, die ich als Scoped :

registriere %Vor%

Dies entspricht ASP.NET Erste Schritte mit ASP.NET 5 und Entity Framework 6 Dokumentation:

  

Der Kontext sollte einmal pro Bereich aufgelöst werden, um die Leistung sicherzustellen und einen zuverlässigen Betrieb von Entity Framework sicherzustellen

Ich registriere dann die entsprechenden UOW-Klassen:

%Vor%

Ich verwende Transient hier basierend auf dieser Artikel, der folgendes vorschlägt:

  

Services, die im Transient-Bereich registriert sind, werden immer dann erstellt, wenn sie in der Anwendung benötigt werden. Das bedeutet, dass eine neue Instanz der Klasse (registrierter Service) vom Abhängigkeits-Injection-Framework jedes Mal erstellt wird, wenn die (Methode, in der die Abhängigkeit erstellt wird) ausgeführt wird.

Ausgehend von diesem Verständnis verwende ich die Registrierung meiner Repository- und Serviceklassen auch unter Scoped :

%Vor%

Dann rufen Sie bei Bedarf die entsprechenden Service-Layer-Methoden in meinen Controllern auf:

%Vor%

Beim Testen scheint diese Konfiguration zu funktionieren und das Setzen der DbContext (s) als Scoped macht Sinn - es scheint unnötig / ineffizient, jedes Mal ein neues Kontextobjekt zu erstellen, wenn es angefordert wird.

Die Wahl zwischen Transient / Singleton / Scoped für die anderen Objekte ist jedoch, wo ich verloren bin. Kann mir jemand helfen, die beste Konfiguration für diese spezifische Implementierung von Mustern zu verstehen?

Das oben erwähnte Setup funktioniert, aber ich suche nach mehr Verständnis für warum Ich sollte die Scopes verwenden, die ich gemacht habe. (d. h. ist Transient die beste Option für meine UOW-Klasse? Warum ist es in dieser Situation besser als Singleton ?).

    
Ben Walters 11.05.2016, 19:57
quelle

1 Antwort

-1
  • Transiente Objekte sind immer verschieden; Eine neue Instanz wird bereitgestellt jeder Controller und jede Dienstleistung.
  • Scoped-Objekte sind in einer Anfrage gleich, unterscheiden sich jedoch in across verschiedene Anfragen
  • Singleton-Objekte sind für jedes Objekt und jede Anfrage gleich (Unabhängig davon, ob eine Instanz in ConfigureServices bereitgestellt wird)

In Ihrem Fall hängt der Service, den Sie injizieren, nicht vom Zustand anderer Objekte in derselben Anfrage ab. Sie verwenden den Dienst, um ein Objekt innerhalb des DB zu erhalten. Entweder ein vorübergehender Dienst oder ein Service mit Gültigkeitsbereich funktioniert.

Wenn Sie in derselben Anfrage den Status Ihres Objekts basierend auf Berechnungen innerhalb derselben Anfrage ändern müssen, müssen Sie Objekte verwenden, die innerhalb derselben Anfrage von Anfang bis Ende existieren (dh: Bereich) / p>     

alessalessio 13.04.2017 15:51
quelle