Estou construindo um aplicativo wpf que implementa os seguintes recursos:
- Obtenha entrada do usuário e leia dados de bancos de dados
- faça alguns cálculos nele
- Apresente-o ao usuário em vários tipos de visualizações e grave as alterações novamente no db
Arquitetura proposta: Banco de Dados -> Entity Framework -> Repositório -> Lógica Comercial -> Serviço de Dados -> ViewModel
Razões para usar essa arquitetura: Vários cenários presentes no aplicativo (Várias exibições) e vários bancos de dados. Portanto, estou disposto a usar o repositório no meio para abstração.
Uma ressalva é que o contexto terá vida longa se o repositório for implementado. Para superar isso, não há problema em criar um contexto e descartá-los em um bloco using () em cada um dos métodos crud.
fique à vontade para sugerir abordagens alternativas.
c#
design
architecture
wpf
Uppercut céu
fonte
fonte
Respostas:
Use um objeto DbContext por acesso a dados ou transação.
DbContext
é um objeto leve; Ele foi projetado para ser usado uma vez por transação comercial. Tornar seuDbContext
Singleton e reutilizá-lo em todo o aplicativo pode causar outros problemas, como problemas de simultaneidade e vazamento de memória.DbContext
implementa essencialmente uma unidade de trabalho. Trate-o adequadamente.Não descarte objetos DbContext.
Embora os
DbContext
implementosIDisposable
, você não deve descartá-lo manualmente, nem envolvê-lo em umausing
declaração.DbContext
gerencia sua própria vida; quando sua solicitação de acesso a dados for concluída,DbContext
a conexão com o banco de dados será fechada automaticamente.Para entender por que esse é o caso, considere o que acontece quando você executa uma instrução Linq em uma coleção de entidades de a
DbContext
. Se você retornar um carregamento lentoIQueryable
do seu método de acesso a dados, você se levantar de um gasoduto que não é realmente executada até que o cliente obriga alguns dados a partir dele (chamandoFirstOrDefault()
,ToList()
ou iteração sobre ele).Leitura adicional
Eu sempre tenho que chamar Dispose () nos meus objetos DbContext?
Por que você não deve usar o Singleton DataContexts no Entity Framework
Returning
IEnumerable<T>
vs. OsIQueryable<T>
repositórios devem retornar
IQueryable
?fonte
using
blocos? Ou simplesmente não estou pensando em algum caso em que o uso de um IQueryable, como você sugere, valeria a pena?DbContext
é responsável por gerenciar sua própria vida. Minha sugestão é deixar fazer isso; funcionará se você estiver usandoIQueryable
ouIEnumerable
. O caso de uso mais óbvio que consigo pensar em carregamento lento é onde você retorna algum objeto ViewModel com uma coleção relacionada, mas a coleção nunca é usada (ou apenas parcialmente usada).IQueryable
permite evitar o custo de recuperar registros não utilizados.Idealmente, o contexto deve ser inicializado e finalizado para uma única transação. No seu caso, o contexto deve ser instanciado no Business Logic e passado para o Repositório para leitura / gravação de dados.
fonte
Se você chamar DbContext em cada método no seu aplicativo, ocorrerá vazamento de memória. Use uma única instância do DbContext. Veja o comentário no exemplo abaixo:
fonte