Indem EF zur Manipulation der Datenbank verwendet wird, der DbContext (Datenbankoperationen-Kontextklasse) in derselben HTTP-Anfrage extrahiert wird, um die Eindeutigkeit sicherzustellen, verwendet der Artikel zwei Schemata, um die Eindeutigkeit des Entity Framework-Kontexts zu gewährleisten, und die Lösung auf der .NET Core-Plattform ist angehängt.
Option 1
Wenn ein Objekt garantiert global eindeutig ist, wirst du definitiv an ein klassisches Designmuster denken: Singleton-Modus, wenn das zu verwendende Objekt im Thread eindeutig sein muss?
Datenslot: CallContext, ok, siehe msdns Erklärung zu Callcontent.
CallContext ist ein dediziertes Sammelobjekt, das einem thread-lokalen Speicher für Methodenaufrufe ähnelt und einen Datenslot bietet, der für jeden logischen Ausführungsthread einzigartig ist. Datenslots werden nicht zwischen Aufrufkontexten anderer logischer Threads geteilt. Objekte können dem CallContext hinzugefügt werden, wenn dieser entlang des Pfades des Ausführungscodes hin und her weiterläuft und von einzelnen Objekten in diesem Pfad inspiziert wird.
Das heißt, der aktuelle Thread speichert das Objekt im lokalen Speicher des Threads, und das Objekt wird vernichtet, während der Thread zerstört wird.
Verwenden Sie Code:
Anwendungsszenarien: Ich persönlich denke, es wird verwendet, wenn das Objekt global innerhalb des Threads verwendet werden muss und die anderen Thread-Paketerweiterungen nicht darauf zugreifen können. Zum Beispiel wird im Datenkontext von EF für jede Anfrage ein Thread generiert, und zu diesem Zeitpunkt wird ein Datenkontextobjekt für verschiedene Funktionen erstellt, die schließlich gemeinsam committen, um Transaktionsprobleme zu vermeiden. Natürlich fragen mich manche Leute, ob ich eine Variable erstellen kann, die natürlich denselben Zweck erfüllt, aber dieses Objekt kann auch mit anderen Thread-Daten interagieren, was dem Konzept widerspricht, im Thread einzigartig zu sein.
Option 2
Das Szenario basiert auf Web-HTTP-Anfragen, da jede Anfrage ein neuer Thread ist und der Code wie folgt aussieht:
Verwendung von "CallContext" in .NET Core
Wir wissen, dass CallContext für nicht mehr verfügbar ist. NETStandard oder .NET Core.
Aber du kannst AsyncLocal verwenden<T>, um einen CallContext zu imitieren, einfach die folgende statische Klasse erstellen:
Namensräume, die referenziert werden müssen:
Es ist außerdem einfach zu bedienen (hier habe ich CallContext in die Common-Bibliothek gelegt):
|