Използвайки EF за манипулиране на базата данни, извличане на DbContext (клас контекст на операция на база данни) в същата HTTP заявка за осигуряване на уникалност, статията използва две схеми за осигуряване на уникалността на контекста на Entity Framework, а решението на платформата .NET Core се прикачва.
Опция 1
Ако даден обект е гарантирано глобално уникален, определено ще се сетите за класически модел на дизайн: сингълтон режим, ако обектът, който ще се използва, трябва да е уникален в нишката?
Слот за данни: CallContext, добре, вижте обяснението на msdn за съдържанието на обаждания.
CallContext е специализиран обект за колекция, подобен на локален ниток за извиквания на методи, и предоставя слот за данни, уникален за всяка нишка за логическо изпълнение. Слотовете за данни не се споделят между контекстите на повиквания в други логически нишки. Обекти могат да се добавят към CallContext, когато той се разпространява напред-назад по пътя на изпълнителния код и се инспектира от отделни обекти в този път.
Тоест, текущата нишка съхранява обекта в локалното хранилище на нишката, а обектът се унищожава, когато нишката се унищожава.
Използвайте код:
Сценарии на използване: Лично аз мисля, че се използва, когато обектът трябва да се използва глобално в рамките на нишката, а другите нишки от разширения на пакета не могат да го достъпят. Например, в контекста на данни на EF, за всяка заявка се генерира нишка и в този момент се създава обект с контекст на данни за различни функции, които могат да се използват, и накрая ще се комитират заедно, за да се избегнат проблеми с транзакциите. Разбира се, някои хора може да ме попитат дали мога да създам променлива, която да използвам, която също може да постигне същата цел, разбира се, но този обект може да взаимодейства и с други данни от нишки, което противоречи на концепцията за уникалност в нишката.
Опция 2
Сценарият се базира на уеб http заявки, защото всяка заявка е нова нишка, а кодът е следният:
Използване на "CallContext" в .NET Core
Знаем, че CallContext вече не е наличен за . NETStandard или .NET Core.
Но можеш да използваш<T> Asynclocal, за да имитираш CallContext, просто създай следния статичен клас:
Пространства от имена, които трябва да бъдат реферирани:
Също така е лесен за използване (тук сложих CallContext в Common библиотеката):
|