Usando EF para manipular o banco de dados, extrair o DbContext (classe de contexto de operação de banco de dados) na mesma requisição HTTP para garantir a unicidade, o artigo usa dois esquemas para garantir a unicidade do contexto do Entity Framework, e a solução na plataforma .NET Core é anexada.
Opção 1
Se um objeto é garantido de ser globalmente único, você certamente vai pensar em um padrão de design clássico: modo singleton, se o objeto a ser usado deve ser único na thread?
Slot de dados: CallContext, ok, veja a explicação do msdn sobre o conteúdo das chamadas.
CallContext é um objeto de coleção dedicado semelhante a um armazenamento local de threads para chamadas de métodos, e fornece um slot de dados único para cada thread de execução lógica. Os slots de dados não são compartilhados entre contextos de chamada em outros threads lógicos. Objetos podem ser adicionados ao CallContext quando ele se propaga de um lado para o outro ao longo do caminho do código de execução e é inspecionado por objetos individuais nesse caminho.
Ou seja, a thread atual armazena o objeto no armazenamento local da thread, e o objeto é destruído à medida que a thread é destruída.
Use código:
Cenários de uso: Pessoalmente, acho que ele é usado quando o objeto precisa ser usado globalmente dentro da thread, e as outras threads de extensão de pacotes de thread não conseguem acessá-lo. Por exemplo, no contexto de dados do EF, uma thread será gerada para cada requisição e, nesse momento, um objeto de contexto de dados será criado para diferentes funções usarem, e finalmente comprometerá juntos para evitar problemas de transação. Claro, algumas pessoas podem me perguntar se posso criar uma variável para usar, que também pode alcançar o mesmo propósito, claro, mas esse objeto também pode interagir com outros dados da thread, o que vai contra o conceito de ser único na thread.
Opção 2
O cenário é baseado em requisições http web, porque cada requisição é um novo thread, e o código é o seguinte:
Usando "CallContext" no .NET Core
Sabemos que o CallContext não está mais disponível para . NETStandard ou .NET Core.
Mas você pode usar Asynclocal<T> para imitar um CallContext, basta criar a seguinte classe estática:
Namespaces que precisam ser referenciados:
Também é fácil de usar (aqui coloquei o CallContext na biblioteca Common):
|