Dependencyinjection: Die vom Singleton referenzierte Bereichsinstanz kann nicht verworfen werden!!!

Erstellt am 19. Jan. 2017  ·  5Kommentare  ·  Quelle: aspnet/DependencyInjection

Ich finde ein Szenario wie folgt:
Es gibt einen "AService" mit der Singleton(services.AddSingleton...)-Lebensdauer, und es wird ein "BRepository" mit der Singleton(services.AddSingleton...)-Lebensdauer benötigt. Der Punkt ist, dass das "BRepository" den "dbContext" mit der "Scoped"-Lebensdauer benötigt. Wenn wir jetzt den "AService" aufrufen, um "CURD"-Operationen mit DB viele Male auszuführen.
der "dbContext" in der "BRepository"-Instanz kann nicht verworfen werden (genau wie Singleton)!! aber ich denke, es sollte erfolgreich entsorgt werden!

also ist das kein bug oder nur gewollt? Können Sie meine Zweifel beantworten?

Hilfreichster Kommentar

Das ist eine gefangene Abhängigkeit. Wenn Sie auf einen Dienst angewiesen sind, der eine kürzere Lebensdauer hat als Sie selbst, verlängern Sie deren Lebensdauer effektiv auf Ihre eigene, wodurch der Grund, warum der Dienst überhaupt mit einer kürzeren Lebensdauer registriert wurde, zunichte gemacht wird. Dies ist normalerweise ein Code-/Design-Geruch und sollte behoben werden, indem entweder die gesamte Kette in den Geltungsbereich versetzt wird oder von einer Fabrik abhängig wird, die Ihnen auf Anfrage Instanzen mit Geltungsbereich zur Verfügung stellen kann (und sie dann ordnungsgemäß entsorgt, wenn sie fertig sind).

Alle 5 Kommentare

Hinweis: Die Operation des "AService" führt jedes Mal nur einen Befehl der DB aus, nicht viel mehr Befehle in einer Operation.

Das ist eine gefangene Abhängigkeit. Wenn Sie auf einen Dienst angewiesen sind, der eine kürzere Lebensdauer hat als Sie selbst, verlängern Sie deren Lebensdauer effektiv auf Ihre eigene, wodurch der Grund, warum der Dienst überhaupt mit einer kürzeren Lebensdauer registriert wurde, zunichte gemacht wird. Dies ist normalerweise ein Code-/Design-Geruch und sollte behoben werden, indem entweder die gesamte Kette in den Geltungsbereich versetzt wird oder von einer Fabrik abhängig wird, die Ihnen auf Anfrage Instanzen mit Geltungsbereich zur Verfügung stellen kann (und sie dann ordnungsgemäß entsorgt, wenn sie fertig sind).

Gibt es eine Art Lösung oder Erinnerung für dieses Szenario in der Funktion? in der neuesten Version von .net Core?
Ich denke, dass es viele Programmierer gibt, die dieses Szenario auch treffen oder ignorieren werden :+1:

@khellang danke für deine Erklärung.

@ZhiqiangTao Die Verwendung eines Dienstes mit kurzer Reichweite von einem Dienst mit längerer Reichweite ist immer problematisch, daher wird empfohlen, dieses Muster zu vermeiden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen