Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 27156|Resposta: 2

[Fonte] EF DbContext garante que o contexto é único

[Copiar link]
Publicado em 22/08/2020 10:21:31 | | |
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):





Anterior:ASP.NET MVC5 é lançado usando o modo pré-compilado, melhorando a velocidade de carregamento e o desempenho da página
Próximo:[Virar]. NET exporta PPT como uma imagem
Publicado em 25/08/2020 23:38:22 |
Não é perfumado com infusão?
 Senhorio| Publicado em 26/08/2020 21:37:39 |
Cucumber Postado em 25-08-2020 23:38
Não é perfumado com infusão?

O ciclo de vida padrão da injeção do asp.net core não atende às minhas necessidades

As instâncias de serviço criadas pelo objeto Singleton: IServiceProvider são armazenadas no objeto IServiceProvider como o contêiner raiz, então múltiplos objetos IServiceProvider com a mesma raiz para o mesmo tipo de instâncias de serviço estão todos no mesmo objeto.
As instâncias de serviço criadas pelo objeto Scoped:IServiceProvider são salvas sozinhas, então as instâncias de serviço do mesmo tipo fornecidas pelo mesmo objeto IServiceProvider são todas o mesmo objeto.
Transiente: Para cada solicitação de prestação de serviço, o objeto IServiceProvider sempre cria uma nova instância de serviço.
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com