Z uporabo EF za manipulacijo baze podatkov, izvleček DbContexta (razred konteksta za operacijo baze podatkov) v isti HTTP zahtevi za zagotovitev edinstvenosti, članek uporablja dve shemi za zagotavljanje edinstvenosti konteksta Entity Framework, rešitev na .NET Core platformi pa je priložena.
Možnost 1
Če je objekt zagotovljeno globalno edinstven, boste zagotovo pomislili na klasičen oblikovalski vzorec: singleton način, če mora biti uporabljeni objekt edinstven v niti?
Podatkovna reža: CallContext, v redu, glej razlago callcontenta na msdn.
CallContext je namenski zbiralni objekt, podoben lokalnemu shrambi za klice metod, in zagotavlja podatkovno režo, ki je edinstvena za vsako logično izvršilno nit. Podatkovne reže niso deljene med konteksti klicev v drugih logičnih nitih. Objekte je mogoče dodati v CallContext, ko se ta širi naprej in nazaj po poti izvršilne kode in ga pregledujejo posamezni objekti na tej poti.
To pomeni, da trenutna nit shrani objekt v lokalno shrambo niti, objekt pa se uniči, ko se nit uniči.
Uporabite kodo:
Scenariji uporabe: Osebno mislim, da se uporablja, ko je predmet treba uporabljati globalno znotraj niti, druge niti paketov pa ne morejo dostopati do njega. Na primer, v EF-jevem podatkovnem kontekstu se za vsako zahtevo ustvari nit, v tem času pa se ustvari objekt podatkovnega konteksta, ki ga različne funkcije uporabljajo in se na koncu združijo, da se izognejo težavam s transakcijami. Seveda me bodo nekateri vprašali, ali lahko ustvarim spremenljivko za uporabo, kar lahko doseže isti namen, seveda, vendar lahko ta objekt tudi interagira z drugimi podatki niti, kar je v nasprotju s konceptom edinstvenosti v niti.
Možnost 2
Scenarij temelji na spletnih HTTP zahtevah, saj je vsaka zahteva nova nit, koda pa je naslednja:
Uporaba "CallContext" v .NET Core
Vemo, da CallContext ni več na voljo za . NETStandard ali .NET Core.
Lahko pa uporabite Asynclocal,<T> da posnemate CallContext, samo ustvarite naslednji statični razred:
Imenski prostori, ki jih je treba referencirati:
Prav tako je enostaven za uporabo (tukaj sem dal CallContext v Common knjižnico):
|