Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 27156|Відповідь: 2

[Джерело] EF DbContext гарантує, що контекст є унікальним

[Копіювати посилання]
Опубліковано 22.08.2020 10:21:31 | | |
Використовуючи 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 у спільну бібліотеку):





Попередній:ASP.NET MVC5 виходить у попередньо скомпільованому режимі, що покращує швидкість завантаження сторінки та продуктивність
Наступний:[Поворот]. NET експортує PPT у вигляді картинки
Опубліковано 25.08.2020 23:38:22 |
Хіба це не пахне від настою?
 Орендодавець| Опубліковано 26.08.2020 21:37:39 |
Cucumber Опубліковано 2020-8-25 23:38
Хіба це не пахне від настою?

asp.net стандартний життєвий цикл ін'єкції ядра не відповідає моїм потребам

Екземпляри сервісів, створені об'єктом Singleton: IServiceProvider, зберігаються на об'єкті IServiceProvider як кореневий контейнер, тому кілька об'єктів IServiceProvider з однаковим коренем для одного типу екземплярів сервісу знаходяться на одному об'єкті.
Екземпляри сервісів, створені об'єктом Scoped:IServiceProvider, зберігаються окремо, тому екземпляри сервісу того ж типу, що й той самий об'єкт IServiceProvider, є однаковими об'єктами.
Транзієнт: Для кожного запиту на надання послуги об'єкт IServiceProvider завжди створює новий екземпляр сервісу.
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com