5 votes

Confusion de l'architecture MVVM + Entity Framework

J'utilise le framework Prism avec EF dans une application WPF.

ViewModel :

  • conserve les références du service (transmises par le conteneur d'unité).

Services :

  • fournissent des opérations de "haut niveau" avec des données
  • garde la référence du référentiel, qui fournit des opérations CRUD de base avec la base de données (une seule table par référentiel).

Dépôt :

  • Chaque méthode du référentiel utilise le modèle "using", où je travaille avec un contexte d'objet de courte durée.

C'est là que je me suis bloqué : après que le contexte de l'objet ait été éliminé, je ne peux plus travailler avec les propriétés mappées. Mon modèle de base de données est complexe (plusieurs tables liées) et les nombreux appels .Include() lors de la récupération des données salissent le code.

Après avoir lu plusieurs fils de discussion, j'ai découvert que le modèle "unité de travail" est probablement ce dont j'ai besoin.

Voici ma question :

Qui garde la référence de l'unité de travail (et donc du contexte) ? Si je choisis l'approche contextuelle par vue, le viewModel doit avoir une référence contextuelle. Comment puis-je alors injecter l'unité de travail dans mes services ? Ou dois-je créer une nouvelle instance de service dans le ViewModel et passer le contexte dans le paramètre du constructeur ?

3voto

Daniel Sklenitzka Points 1203

Nous utilisons une architecture similaire dans un projet :

  • Chaque ViewModel obtient son propre objet Service qui est injecté dans le constructeur (au moins ceux de niveau supérieur qui correspondent directement à une vue. Certains ViewModels hiérarchiques peuvent réutiliser le Service de leur parent, mais restons simples ici).

  • Par défaut, chaque opération de service crée un nouveau contexte, mais...

  • Les services ont des méthodes BeginContext et EndContext qui peuvent être appelées par les ViewModels pour maintenir le contexte ouvert sur plusieurs opérations.

Cela a plutôt bien fonctionné pour nous. La plupart du temps, nous appelons BeginContext lorsqu'une vue est ouverte et EndContext lorsqu'elle est fermée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X