Verwenden Sie DbContext in ASP.Net Singleton Injected Class

9

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%     
Tjaart 31.03.2016, 11:33
quelle

2 Antworten

8

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.

%Vor%

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.

    
Joe Audette 31.03.2016, 11:49
quelle
2

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.

    
Tjaart 31.03.2016 14:01
quelle