J'ai récemment lu de nombreux arguments contre l'utilisation du modèle de référentiel avec de puissants ORM comme Entity Framework, car il intègre également des fonctionnalités de type référentiel, ainsi que des fonctionnalités d'unité de travail.
Un autre argument contre l'utilisation du modèle pour une situation comme les tests unitaires est que le modèle de référentiel est une abstraction qui fuit car les implémentations plus génériques exploitent IQueryable.
Les arguments contre l'utilisation du modèle de référentiel ont du sens pour moi, mais les méthodes alternatives d'abstraction suggérées sont souvent plus confuses et semblent tout aussi exagérées que le problème.
La solution de Jimmy Bogards semble être un mélange de souffler les abstractions, mais aussi d'introduire sa propre architecture. https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
Un autre exemple de référentiels inutilement .... mais utilisez mon architecture! http://blog.gauffin.org/2012/10/22/griffin-decoupled-the-queries/
Un autre ... http://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework
Je n'ai pas trouvé de remplacement ou d'alternative claire à l'approche de modèle de référentiel «trop complexe» qui n'est pas plus architecturée elle-même.
la source
Réponses:
Je pense que vous confondez les référentiels et les référentiels génériques.
Un référentiel de base interface simplement votre magasin de données et fournit des méthodes pour renvoyer les données
Il ne fuit pas la couche de données dans votre code via un IQueryable ou d'autres moyens de passer dans des requêtes aléatoires et fournit une surface de méthodes testable et injectable bien définie.
Un référentiel générique vous permet de transmettre votre requête un peu comme un ORM
Je suis d'accord qu'il ne sert à rien d'utiliser un référentiel générique au-dessus d'un ORM qui est fondamentalement juste un autre référentiel générique.
La réponse est d'utiliser le modèle de référentiel de base pour masquer votre ORM
la source
La plupart des arguments que vous mentionnez attribuent à tort aux fonctions de modèle de référentiel qu'il n'a pas.
Sur le plan conceptuel, un référentiel tel que défini à l'origine dans DDD n'est qu'une collection d'objets que vous pouvez rechercher ou ajouter. Le mécanisme de persistance derrière est abstrait, donc en tant que consommateur, vous avez l'illusion qu'il s'agit d'une collection en mémoire.
Une implémentation de référentiel qui a des abstractions qui fuient (exposant
IQueryables
par exemple) est une implémentation de référentiel médiocre.Une implémentation de référentiel qui expose plus que de simples opérations de collecte (par exemple, les fonctionnalités Unit of Work) est une implémentation de référentiel médiocre.
Existe-t-il des alternatives au référentiel pour l'accès aux données? Oui, mais ils ne sont pas liés aux problèmes que vous soulevez dans votre question.
la source
Pour moi, les référentiels, combinés avec ORM ou d'autres couches de persistance DB, ont ces inconvénients:
Tel que:
4. Objet Danger of God: vous pourriez être tenté de créer une classe divine, couvrant l'ensemble de votre modèle ou couche d'accès aux données. La classe de référentiel contiendrait non seulement des méthodes Car, mais des méthodes pour toutes les entités.
À mon avis, il est préférable d'offrir au moins quelques opportunités de requête, pour éviter le gâchis énorme de nombreuses méthodes à usage unique. Peu importe qu'il s'agisse de LINQ, d'un langage de requête propre, ou même de quelque chose tiré directement de l'ORM (OK, genre de problème de couplage ...).
la source
Si le but de l'interface du référentiel est de se moquer de la base de données pour un test unittest (= test isolé), la meilleure abstraction est quelque chose qui est facile à se moquer.
Il est difficile de se moquer d'une interface de référentiel basée sur un résultat IQueryable.
Du point de vue des tests unitaires
peut se moquer facilement
ne peut être simulé facilement que si le simulateur ignore le contenu du paramètre de requête.
ne peut pas être facilement moqué
la source
Je ne pense pas que le modèle de référentiel soit exagéré, si vous utilisez des fonctions lambda pour interroger. Surtout lorsque vous devez faire abstraction de l'ORM (à mon avis, vous devriez toujours le faire), alors je ne me soucierai pas des détails d'implémentation du référentiel lui-même.
Par exemple:
la source