EF:n avulla tietokantaa käsitellään, DbContextin (tietokantaoperaatiokontekstiluokka) poimiminen samassa HTTP-pyynnössä ainutlaatuisuuden varmistamiseksi, artikkelissa käytetään kahta menetelmää Entity Frameworkin ainutlaatuisuuden varmistamiseksi, ja .NET Core -alustan ratkaisu liitetään.
Vaihtoehto 1
Jos objekti on taattu, että se on globaalisti ainutlaatuinen, keksit varmasti klassisen suunnittelumallin: singleton-tila, jos käytettävän objektin täytyy olla ainutlaatuinen säikeessä?
Datapaikka: CallContext, ok katso msdn:n selitys callcontentista.
CallContext on omistettu kokoelma-objekti, joka muistuttaa säikeen paikallista tallennusta metodikutsuille, ja tarjoaa datapaikan, joka on ainutlaatuinen jokaiselle loogiselle suoritussäikeelle. Datapaikkoja ei jaeta puhelukontekstien välillä muissa loogisissa säikeissä. Olioita voidaan lisätä CallContextiin, kun se etenee edestakaisin suorituskoodin polun varrella ja yksittäisten olioiden tarkastelema kyseisellä polulla.
Toisin sanoen nykyinen säie tallentaa objektin säikeen paikalliseen tallennustilaan, ja objekti tuhoutuu säikeen tuhoamisen mukana.
Käytä koodia:
Käyttötilanteet: Mielestäni sitä käytetään, kun objektia täytyy käyttää globaalisti säikeessä ja muut säikepaketin laajennussäikeet eivät pääse siihen käsiksi. Esimerkiksi EF:n datakontekstissa jokaiselle pyynnölle luodaan säie, ja tällöin luodaan datakontekstiobjekti, jota eri funktiot voivat käyttää, ja lopuksi yhdistetään transaktio-ongelmien välttämiseksi. Tietenkin jotkut saattavat kysyä minulta, voinko luoda käytettävissä olevan muuttujan, joka voi myös saavuttaa saman tarkoituksen, mutta tämä objekti voi myös olla vuorovaikutuksessa muiden säikeiden tietojen kanssa, mikä on ristiriidassa ainutlaatuisuuden käsitteen kanssa.
Vaihtoehto 2
Tilanne perustuu web-http-pyyntöihin, koska jokainen pyyntö on uusi säie, ja koodi on seuraava:
"CallContextin" käyttö .NET Coressa
Tiedämme, että CallContext ei ole enää saatavilla . NETStandard tai .NET Core.
Mutta voit käyttää<T> Asynclocalia matkimaan CallContextia, luo vain seuraava staattinen luokka:
Nimiavaruudet, joihin täytyy viitata –
Se on myös helppokäyttöinen (tässä olen laittanut CallContextin Common-kirjastoon):
|