Folosind EF pentru a manipula baza de date, a extrage DbContext (clasa de context a operării bazei de date) în aceeași cerere HTTP pentru a asigura unicitatea, articolul folosește două scheme pentru a asigura unicitatea contextului Entity Framework, iar soluția de pe platforma .NET Core este atașată.
Opțiunea 1
Dacă un obiect este garantat să fie global unic, cu siguranță vei gândi la un model clasic de design: modul singleton, dacă obiectul folosit trebuie să fie unic în firul de discuție?
Slot de date: CallContext, ok, vezi explicația msdn despre conținutul apelurilor.
CallContext este un obiect dedicat de colecție, similar cu un depozit thread-local pentru apeluri de metodă, și oferă un slot de date unic fiecărui fir logic de execuție. Sloturile de date nu sunt partajate între contextele apelurilor pe alte fire logice. Obiectele pot fi adăugate în CallContext atunci când acesta se propagă înainte și înapoi de-a lungul traseului codului de execuție și este inspectat de obiecte individuale din acel drum.
Adică, firul curent stochează obiectul în spațiul local de stocare al firului, iar obiectul este distrus pe măsură ce firul este distrus.
Folosește codul:
Scenarii de utilizare: Personal, cred că este folosit atunci când obiectul trebuie folosit global în cadrul firului de dischet, iar celelalte fire de extensie ale pachetelor de thread nu pot avea acces la el. De exemplu, în contextul de date al EF, un fir de discuție va fi generat pentru fiecare solicitare, iar în acest moment va fi creat un obiect de context de date pentru diferite funcții, care în final va fi făcut commit împreună pentru a evita problemele de tranzacții. Desigur, unii oameni m-ar putea întreba dacă pot crea o variabilă de folosit, care poate atinge același scop, desigur, dar acest obiect poate interacționa și cu alte date ale firului, ceea ce contravine conceptului de a fi unic în fir.
Opțiunea 2
Scenariul se bazează pe cereri web http, deoarece fiecare cerere este un fir nou, iar codul este următorul:
Folosirea "CallContext" în .NET Core
Știm că CallContext nu mai este disponibil pentru . NETStandard sau .NET Core.
Dar poți folosi Asynclocal<T> pentru a imita un CallContext, doar creează următoarea clasă statică:
Spații de nume care trebuie referențiate:
Este, de asemenea, ușor de folosit (aici am pus CallContext în biblioteca Common):
|