Используя 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):
|