J'ai beaucoup entendu parler du modèle de référentiel, mais je ne comprenais pas vraiment ce qu'un référentiel devrait vraiment faire. Quand je dis "ce qu'un dépôt devrait vraiment faire", je suis principalement préoccupé par les méthodes qu'il devrait fournir. Par exemple, un référentiel devrait-il vraiment fournir des méthodes CRUD, ou devrait-il fournir un autre type de méthode?
Je veux dire, les référentiels doivent-ils contenir une logique métier, ou doivent-ils simplement contenir la logique pour communiquer avec le magasin de données et gérer les entités à enregistrer ou à charger?
J'ai également entendu dire que les référentiels sont des unités de persistance pour les agrégats. Mais comment est-ce? Je n'arrive pas à comprendre comment cela fonctionne dans la pratique. Je pensais que nous devrions avoir une seule interface IRepository
qui contient les méthodes CRUD, puis pour toute entité, l'implémentation contiendrait simplement la logique pour enregistrer et récupérer ce type dans le magasin de données.
la source
Réponses:
Eh bien, vous pouvez voir un bon exemple dans Spring Data Framework qui est basé sur le concept de référentiels.
Là, vous verrez que les référentiels ne traitent que du magasin de données et contiennent rarement une logique métier (ceci est réservé à la couche de service). Ainsi, par exemple, vous jetez un œil à leur conception, vous verrez qu'ils ont une interface CRUDRepository qui expose des méthodes pour créer, détruire et récupérer des entités (entre autres). Il existe également un PagingAndSortingRepository qui ajoute des fonctionnalités supplémentaires pour cela, le tri et la pagination des résultats, etc., etc.
Donc, ce cadre est peut-être un bon endroit pour étudier une bonne conception de référentiel.
Pour autant que je sache, bon nombre des concepts mis en œuvre par Spring Data Framework proviennent d'un grand livre intitulé Domain-Driven Design: Tackling Complexity in the Heart of Software , le livre a une section entière dédiée à la conception de référentiels.
Vous pourriez envisager d'en obtenir une copie.
Un petit extrait du livre explique:
la source
Il ne devrait ni fournir une interface CRUD directe ni faire de logique métier. Il sert de médiateur entre la logique métier et la base de données. L'interface doit être en termes de logique métier mais ne pas exécuter la logique métier elle-même, plus comme une primitive de logique métier. Par exemple, disons que vous alliez créer un système de messagerie, vous avez des utilisateurs et des messages. Votre référentiel fournirait des opérations CRUD de base pour les utilisateurs et les messages, mais il fournirait également des vues filtrées de messages tels que GetUsersNewMessages (utilisateur) ou GetSearchedMessages (utilisateur, searchTerms).
L'idée est que le référentiel masque la façon dont le stockage est implémenté et fournit une interface propre qui permet un accès flexible et rapide aux données. Garder les opérations en termes de haut niveau de ce qui devrait se produire plutôt que de la façon dont vous avez plus de flexibilité pour les implémenter de la manière la plus appropriée pour le magasin de support sous-jacent.
la source