Izmantojot EF, lai manipulētu ar datu bāzi, izvilktu DbContext (datu bāzes operācijas konteksta klasi) tajā pašā HTTP pieprasījumā, lai nodrošinātu unikalitāti, rakstā tiek izmantotas divas shēmas, lai nodrošinātu Entity Framework konteksta unikalitāti, un ir pievienots risinājums .NET Core platformā.
1. variants
Ja objekts ir garantēts globāli unikāls, jūs noteikti domājat par klasisku dizaina modeli: singleton režīmu, ja izmantojamajam objektam jābūt unikālam pavedienā?
Datu slots: CallContext, labi skatiet msdn skaidrojumu par zvana saturu.
CallContext ir īpašs kolekcijas objekts, kas līdzīgs pavediena lokālajai krātuvei metodes izsaukumiem, un nodrošina datu slotu, kas ir unikāls katram loģiskās izpildes pavedienam. Datu sloti netiek koplietoti starp zvanu kontekstiem citos loģiskajos pavedienos. Objektus var pievienot CallContext, kad tas izplatās uz priekšu un atpakaļ pa izpildes koda ceļu un tiek pārbaudīts ar atsevišķiem objektiem šajā ceļā.
Tas nozīmē, ka pašreizējais pavediens saglabā objektu pavediena lokālajā krātuvē, un objekts tiek iznīcināts, kad pavediens tiek iznīcināts.
Izmantojiet kodu:
Lietošanas scenāriji: Es personīgi domāju, ka tas tiek izmantots, ja objekts ir jāizmanto globāli pavedienā, un citi pavedienu pakotnes paplašinājuma pavedieni tam nevar piekļūt. Piemēram, EF datu kontekstā katram pieprasījumam tiks ģenerēts pavediens, un šajā laikā tiks izveidots datu konteksta objekts, lai izmantotu dažādas funkcijas un visbeidzot kopīgi apņemtos, lai izvairītos no darījumu problēmām. Protams, daži cilvēki man var jautāt, vai es varu izveidot mainīgo, kas, protams, var sasniegt arī to pašu mērķi, bet šis objekts var mijiedarboties arī ar citiem pavediena datiem, kas ir pretrunā ar jēdzienu par unikālu pavedienu.
2. variants
Scenārija pamatā ir tīmekļa http pieprasījumi, jo katrs pieprasījums ir jauns pavediens, un kods ir šāds:
"CallContext" izmantošana .NET Core
Mēs zinām, ka CallContext vairs nav pieejams . NETStandard vai .NET Core.
Bet jūs varat izmantot Asynclocal<T>, lai atdarinātu CallContext, vienkārši izveidojiet šādu statisko klasi:
Nosaukumvietas, uz kurām jāatsaucas:
Tas ir arī viegli lietojams (šeit es esmu ievietojis CallContext kopējā bibliotēkā):
|