Estoy creando una aplicación wpf que implementa las siguientes características:
- Tome la entrada del usuario y lea datos de bases de datos
- realizar algunos cálculos al respecto
- Muestre al usuario en múltiples tipos de vistas y escriba los cambios de nuevo en db
Arquitectura propuesta: Base de datos -> Entity Framework -> Repository -> Business Logic -> Data Service -> ViewModel
Razones para usar esta arquitectura: múltiples escenarios presentes en la aplicación (múltiples vistas) y múltiples bases de datos. Por lo tanto, estoy dispuesto a utilizar el repositorio en el medio para la abstracción.
Una advertencia es que el contexto durará mucho tiempo si se implementa el repositorio. Para superar esto, ¿está bien crear un contexto y disponerlos en un bloque using () en cada uno de los métodos crudos?
siéntase libre de sugerir enfoques alternativos.
c#
design
architecture
wpf
Skyuppercut
fuente
fuente
Respuestas:
Utilice un objeto DbContext por acceso a datos o transacción.
DbContext
es un objeto liviano; Está diseñado para usarse una vez por transacción comercial. HacerDbContext
un Singleton y reutilizarlo en toda la aplicación puede causar otros problemas, como problemas de concurrencia y pérdida de memoria.DbContext
esencialmente implementa una Unidad de Trabajo. Trátelo en consecuencia.No deseche objetos DbContext.
Aunque los
DbContext
implementosIDisposable
, no debe desecharlos manualmente, ni debe envolverlos en unausing
declaración.DbContext
maneja su propia vida; cuando se complete su solicitud de acceso a datos,DbContext
se cerrará automáticamente la conexión de la base de datos por usted.Para comprender por qué este es el caso, considere lo que sucede cuando ejecuta una instrucción Linq en una colección de entidades desde a
DbContext
. Si devuelve un perezoso de cargaIQueryable
de su método de acceso de datos, se pone de pie una tubería que no se ejecuta realmente hasta que el cliente obliga a algunos datos de él (llamandoFirstOrDefault()
,ToList()
o interactuando sobre ella).Lecturas adicionales
¿Siempre tengo que llamar a Dispose () en mis objetos DbContext?
¿Por qué no debería usar Singleton DataContexts en Entity Framework
Retornando
IEnumerable<T>
vs.IQueryable<T>
Deberían retornar los repositorios
IQueryable
?fuente
using
bloques? ¿O simplemente no estoy pensando en algún caso en el que valga la pena usar un IQueryable como usted sugiere?DbContext
es responsable de administrar su propia vida. Mi sugerencia es dejar que haga eso; funcionará si está usandoIQueryable
oIEnumerable
. El caso de uso más obvio que se me ocurre para la carga diferida es cuando devuelve algún objeto ViewModel con una colección relacionada, pero la colección nunca se usa (o solo se usa parcialmente).IQueryable
le permite evitar el costo de recuperar registros no utilizados.Idealmente, el contexto debe ser inicializado y terminado para una sola transacción. En su caso, el contexto se debe instanciar en Business Logic y pasar al Repositorio para la lectura / escritura de datos.
fuente
Si llama a DbContext en cada método de su aplicación, experimentará una pérdida de memoria. Use una sola instancia de DbContext. Vea el comentario en el siguiente ejemplo:
fuente