Ich muss auf meine Datenbank in einer Singleton-Klasse zugreifen, die in meiner Startup-Klasse instanziiert wurde. Es scheint, dass das direkte Injizieren zu einem DbContext führt, der entsorgt wird.
Ich erhalte den folgenden Fehler:
Auf ein entsorgtes Objekt kann nicht zugegriffen werden. Objektname: 'MyDbContext'.
Meine Frage ist zweifach: Warum funktioniert das nicht und wie kann ich auf meine Datenbank in einer Singleton-Klasseninstanz zugreifen?
Hier ist meine ConfigureServices-Methode in meiner Startup-Klasse:
%Vor%Hier ist meine Controller-Klasse:
%Vor%Hier ist meine FunClass:
%Vor% Der Grund, warum es nicht funktioniert, ist, dass die Erweiterung .AddDbContext
es als Bereich für jede Anfrage hinzufügt. Scoped pro Anfrage ist in der Regel das, was Sie wollen und in der Regel speichern Änderungen würden einmal pro Anfrage aufgerufen werden und dann würde die dbcontext
am Ende der Anfrage angeordnet werden.
Wenn Sie wirklich eine dbContext
innerhalb einer singleton
verwenden müssen, dann sollte Ihre FunClass
-Klasse wahrscheinlich eine Abhängigkeit von IServiceProvider
und DbContextOptions
nehmen, anstatt direkt eine Abhängigkeit von DbContext
zu nehmen, Auf diese Weise können Sie es selbst erstellen.
Das heißt, mein Rat wäre, sorgfältig zu überlegen, ob Sie Ihre FunClass wirklich als Singleton brauchen, das würde ich vermeiden, wenn Sie nicht einen guten Grund dafür haben, es zu einem Singleton zu machen.
Die Lösung bestand darin, AddSingleton mit meiner Klasse aufzurufen, die im Methodenparameter in meiner Startup-Klasse instanziiert wurde:
%Vor%Die Lösung war, meine DbContext-Klasse zu ändern:
%Vor%Wie mehrere Leute jedoch gewarnt haben, könnte die Verwendung eines DbContext in einer Singleton-Klasse eine sehr schlechte Idee sein. Meine Verwendung ist im realen Code sehr begrenzt (nicht das Beispiel FunClass), aber ich denke, wenn Sie dies tun, wäre es besser, andere Wege zu finden.
Tags und Links c# dependency-injection asp.net-core