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:
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 ?).
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>
Tags und Links c# entity-framework dependency-injection asp.net-core unit-of-work