Je crée une application wpf qui implémente les fonctionnalités suivantes:
Architecture proposée: Base de données -> Entity Framework -> Repository -> Business Logic -> Data Service -> ViewModel
Raisons d'utiliser cette architecture: plusieurs scénarios présents dans l'application (plusieurs vues) et plusieurs bases de données. Par conséquent, je suis prêt à utiliser le référentiel au milieu pour l'abstraction.
Une mise en garde est que le contexte sera de longue durée si le référentiel est implémenté. Pour surmonter cela, est-il correct de créer un contexte et de les disposer dans un bloc using () dans chacune des méthodes crud.?
n'hésitez pas à suggérer des approches alternatives.
DbContext
est un objet léger; il est conçu pour être utilisé une fois par transaction commerciale. Faire de votre DbContext
un singleton et le réutiliser dans l'application peut entraîner d'autres problèmes, comme des problèmes de simultanéité et de fuite de mémoire.
DbContext
implémente essentiellement une Unité de travail. Traitez-la en conséquence.
Bien que DbContext
implémente IDisposable
, vous ne devez pas le supprimer manuellement, ni l'envelopper dans une instruction using
. DbContext
gère sa propre durée de vie; lorsque votre demande d'accès aux données est terminée, DbContext
ferme automatiquement la connexion à la base de données pour vous.
Pour comprendre pourquoi c'est le cas, considérez ce qui se passe lorsque vous exécutez une instruction Linq sur une collection d'entités à partir d'un DbContext
. Si vous renvoyez un IQueryable
à chargement différé à partir de votre méthode d'accès aux données, vous mettez en place un pipeline qui n'est pas réellement exécuté tant que le client n'en a pas forcé certaines données (en appelant FirstOrDefault()
, ToList()
ou itérer dessus).
Lectures complémentaires
Dois-je toujours appeler Dispose () sur mes objets DbContext?
Pourquoi vous ne devriez pas utiliser Singleton DataContexts dans Entity Framework
renvoyant IEnumerable<T>
contre. IQueryable<T>
Les référentiels doivent-ils renvoyer IQueryable
?