Використовуючи 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 у спільну бібліотеку):
|