Meine App verwendet ein Singleton-Muster für eine Handlerklasseninstanz. Es ist für die Behandlung einiger Ereignisse verantwortlich:Wie aktualisiere ich DB in Singleton-Instanz?
public class MyHandler
{
public void HandlerEvent(object sender, EventArgs e)
{
//want to update DB here
}
}
Es ist möglicherweise MyHandler muss Interaktion mit DB starten. Also kann ich es tun? Es ist meine Vision:
- nur zäh befestigen
DbContext
als Singleton beiMyHandler
. Offensichtlich ist es eine schlechte Idee. - Verwenden Sie ASP.Net Core DI-Funktionen und senden Sie
DbContext
anMyHandler
, aber als eine Instanz "eine pro Anforderung". Ich denke, in meinem Fall (MyHandler
ist Singleton) ist dies ähnlich zu 1 - Do durch
using
Operator, d.h. als atomare Transaktion, für z.B.using(var context = new XDbContext()) {...}
Für mich ist es ein guter Ansatz, aber DbContext der Entity Framework Core-Implementierung benötigtDbContextOptions
als Argument des Konstruktors. Wenn ich einen parameterlosen Konstruktor für XDbContext deklariere, löst er eine Ausnahme aus.
Irgendwelche Ideen?
Warum Sie nicht die Instanz in jeder Anforderung verlängern? Wie zum Beispiel eine 'DbContext'-Eigenschaft in Ihrer' MyHandler'-Klasse und in der Sie Ihre Instanz von 'XDbContext' erneuern, brauchen Sie sich keine Gedanken um vorherige Instanzen zu machen, da diese über GC gesammelt werden. – Emad
@Emad in meinem Fall 'HandlerEvent' verarbeitet Nachrichten, die von azure Service Bus ankommt, d. H. Es hängt nicht von http-Anfragen ab – Mergasov
Mein Punkt ist immer noch gültig, obwohl die Antwort von Egorikas dasselbe mit dem Fabrikmuster tut. Sie können den gesamten Code der Factory in der get-Methode meiner DbContext-Eigenschaft erstellen lassen. – Emad