Met EF om de database te manipuleren, de DbContext (database operation context class) te extraheren in hetzelfde HTTP-verzoek om uniciteit te waarborgen, gebruikt het artikel twee schema's om de uniciteit van de Entity Framework-context te waarborgen, en de oplossing op het .NET Core-platform is gekoppeld.
Optie 1
Als een object gegarandeerd wereldwijd uniek is, denk je zeker aan een klassiek ontwerppatroon: singleton-modus, als het object dat gebruikt moet worden uniek moet zijn in de thread?
Dataslot: CallContext, oké, zie de uitleg van msdn over callcontent.
CallContext is een toegewijd verzamelobject vergelijkbaar met een thread-local store voor methode-aanroepen, en biedt een dataslot dat uniek is voor elke logische uitvoeringsdraad. Dataslots worden niet gedeeld tussen aanroepcontexten op andere logische threads. Objecten kunnen aan de CallContext worden toegevoegd wanneer deze heen en weer beweegt langs het pad van de uitvoeringscode en wordt geïnspecteerd door individuele objecten in dat pad.
Dat wil zeggen, de huidige thread slaat het object op in de lokale opslag van de thread, en het object wordt vernietigd terwijl de thread wordt vernietigd.
Gebruik code:
Gebruiksscenario's: Ik denk persoonlijk dat het wordt gebruikt wanneer het object globaal binnen de thread gebruikt moet worden, en de andere threads van threadpakketextensie er geen toegang toe hebben. Bijvoorbeeld, in de datacontext van EF wordt voor elk verzoek een thread gegenereerd, en op dat moment wordt een datacontextobject gemaakt voor verschillende functies om te gebruiken en uiteindelijk samen te committen om transactieproblemen te voorkomen. Natuurlijk zullen sommige mensen me vragen of ik een variabele kan maken om te gebruiken, die natuurlijk hetzelfde doel kan bereiken, maar dit object kan ook interageren met andere threaddata, wat indruist tegen het concept van uniek zijn in de thread.
Optie 2
Het scenario is gebaseerd op web-http-verzoeken, omdat elk verzoek een nieuwe thread is en de code als volgt is:
Gebruik van "CallContext" in .NET Core
We weten dat CallContext niet langer beschikbaar is voor . NETStandard of .NET Core.
Maar je kunt Asynclocal gebruiken<T> om een CallContext na te bootsen, maak gewoon de volgende statische klasse:
Naamruimtes die moeten worden geraadpleegd:
Het is ook eenvoudig te gebruiken (hier heb ik CallContext in de Common-bibliotheek gezet):
|