Vous avez vraiment raison. DbContext
est une implémentation du modèle d'unité de travail et IDbSet
est une implémentation du modèle de référentiel.
Les référentiels sont actuellement très populaires et surutilisés. Tout le monde les utilise simplement parce qu'il existe des dizaines d'articles sur la création d'un référentiel pour le cadre d'entité, mais personne ne décrit réellement les défis liés à cette décision.
Les principales raisons d'utiliser le référentiel sont généralement:
- Masquer EF de la couche supérieure
- Rendre le code plus testable
La première raison est une sorte de pureté architectonique et une excellente idée que si vous rendez vos couches supérieures indépendantes sur EF, vous pouvez plus tard passer à un autre cadre de persistance. Combien de fois avez-vous vu une telle chose dans le monde réel? Cette raison rend le travail avec EF beaucoup plus difficile car votre référentiel doit exposer de nombreuses fonctionnalités supplémentaires enveloppant ce que EF autorise par défaut.
Dans le même temps, l'encapsulation du code EF peut garder votre code mieux organisé et suivre la règle de séparation des préoccupations. Pour moi, cela peut être le seul réel avantage du référentiel et de l'unité de travail, mais vous devez comprendre que suivre cette règle avec EF rendra peut-être votre code mieux maintenable et mieux lisible, mais dans l'effort initial pour créer votre application sera beaucoup plus élevé et pour les petites applications, cela peut être une complexité inutile.
La deuxième raison est partiellement correcte. Le gros inconvénient d'EF est une architecture rigide qui peut difficilement être moquée.Par conséquent, si vous souhaitez effectuer un test unitaire sur la couche supérieure, vous devez en quelque sorte envelopper EF pour permettre de se moquer de son implémentation. Mais cela a de nombreuses autres conséquences que j'ai décrites ici .
Je suis le blog d'Ayende . Si vous avez déjà utilisé NHibernate, vous connaissez probablement ses articles. Ce type a récemment écrit plusieurs articles contre l'utilisation du référentiel avec NHibernate, mais NHibernate est beaucoup mieux mockable.