Genom att använda EF för att manipulera databasen, extrahera DbContext (databasens operationskontextklass) i samma HTTP-förfrågan för att säkerställa unikhet, använder artikeln två scheman för att säkerställa Unikheten i Entity Framework-kontexten, och lösningen på .NET Core-plattformen är kopplad.
Alternativ 1
Om ett objekt garanterat är globalt unikt, kommer du definitivt att tänka på ett klassiskt designmönster: singleton-läge, om objektet som ska användas måste vara unikt i tråden?
Dataplats: CallContext, okej, se msdn:s förklaring av callcontent.
CallContext är ett dedikerat samlingsobjekt liknande en trådlokal lagring för metodanrop, och tillhandahåller en dataplats som är unik för varje logisk exekveringstråd. Dataplatser delas inte mellan anropskontexter på andra logiska trådar. Objekt kan läggas till i CallContext när den propagerar fram och tillbaka längs exekveringskodens path och inspekteras av enskilda objekt i den pathen.
Det vill säga, den aktuella tråden lagrar objektet i trådens lokala lagring, och objektet förstörs samtidigt som tråden förstörs.
Använd kod:
Användningsscenarier: Jag tror personligen att det används när objektet behöver användas globalt inom tråden, och de andra trådarnas paketförlängningstrådar inte kan komma åt det. Till exempel, i EF:s datakontext genereras en tråd för varje förfrågan, och vid denna tidpunkt skapas ett datakontextobjekt för olika funktioner att använda, och slutligen committa tillsammans för att undvika transaktionsproblem. Självklart kan vissa fråga mig om jag kan skapa en variabel att använda, vilket också kan uppnå samma syfte, förstås, men detta objekt kan också interagera med annan tråddata, vilket går emot konceptet att vara unik i tråden.
Alternativ 2
Scenariot baseras på web-http-förfrågningar, eftersom varje förfrågan är en ny tråd, och koden är följande:
Att använda "CallContext" i .NET Core
Vi vet att CallContext inte längre är tillgängligt för . NETStandard eller .NET Core.
Men du kan använda Asynclocal<T> för att efterlikna en CallContext, skapa bara följande statiska klass:
Namnrymder som behöver refereras:
Det är också lätt att använda (här har jag lagt CallContext i Common-biblioteket):
|