Naudojant EF manipuliuoti duomenų baze, išskleisti DbContext (duomenų bazės operacijos konteksto klasę) toje pačioje HTTP užklausoje, kad būtų užtikrintas unikalumas, straipsnyje naudojamos dvi schemos, užtikrinančios subjektų sistemos konteksto unikalumą, ir pridedamas sprendimas .NET Core platformoje.
1 variantas
Jei objektas garantuotai bus unikalus visame pasaulyje, tikrai pagalvosite apie klasikinį dizaino modelį: singletono režimą, jei naudojamas objektas turi būti unikalus siūle?
Duomenų lizdas: CallContext, gerai žr. msdn paaiškinimą callcontent.
CallContext yra specialus rinkinio objektas, panašus į gijos vietinę saugyklą, skirtą metodų iškvietimams, ir suteikia duomenų lizdą, kuris yra unikalus kiekvienai loginei vykdymo gijai. Duomenų lizdai nėra bendrinami tarp skambučių kontekstų kitose loginėse gijose. Objektai gali būti įtraukti į CallContext, kai jis plinta pirmyn ir atgal vykdymo kodo keliu ir yra tikrinamas atskirų objektų tame kelyje.
Tai reiškia, kad dabartinė gija saugo objektą vietinėje gijos saugykloje, o objektas sunaikinamas, kai gija sunaikinama.
Naudokite kodą:
Naudojimo scenarijai: Aš asmeniškai manau, kad jis naudojamas, kai objektas turi būti naudojamas globaliai per giją, ir kitų gijų paketo išplėtimo gijos negali pasiekti jį. Pavyzdžiui, EF duomenų kontekste kiekvienai užklausai bus sugeneruota gija, o šiuo metu bus sukurtas duomenų konteksto objektas, skirtas skirtingoms funkcijoms naudoti, ir galiausiai įsipareigoti kartu, kad būtų išvengta operacijų problemų. Žinoma, kai kurie žmonės gali manęs paklausti, ar galiu sukurti kintamąjį, kuris, žinoma, taip pat gali pasiekti tą patį tikslą, tačiau šis objektas taip pat gali sąveikauti su kitais gijų duomenimis, o tai prieštarauja koncepcijai, kad gija yra unikali.
2 variantas
Scenarijus pagrįstas žiniatinklio http užklausomis, nes kiekviena užklausa yra nauja gija, o kodas yra toks:
"CallContext" naudojimas .NET Core
Žinome, kad "CallContext" nebegalima naudoti . NETStandard arba .NET Core.
Tačiau galite naudoti Asynclocal<T>, kad imituotumėte CallContext, tiesiog sukurkite šią statinę klasę:
Vardų sritys, kurias reikia nurodyti:
Tai taip pat paprasta naudoti (čia aš įdėjau CallContext į bendrą biblioteką):
|