Temps estimé: 20 minutes
Série d'exercices sur le Repository
Question 1
Qu'est-ce qu'un repository?
Un repository est une abstraction qui permet de conserver et récupérer des objets du domaine.
Question 2
Quand utilise t-on un repository?
Pour séparer la préoccupation de persistance versus le domaine d'affaires. En ajoutant une abstraction, on empêche les changements de persistance d'affecter le domaine ex: changement au niveau de la source de données, changement dans la manière dont les tables sont structurées => le domaine n'est pas affecté, car l'interface est présente.
Le repository est utilisé lorsque le contexte est riche (beaucoup de logique). De plus, un repository est nécessaire lorsque la représentation des données diffère du besoin du domaine d'affaires ex. le domaine a besoin d'un objet X mais les informations constituant X sont éparpillées parmi plusieurs tables dans la base de données.
Question 3
Dessinez l'interface et l'implémentation du repository dans un modèle hexagonal
Une interface qui est dans la couche de domaine et l'implémentation qui se trouve dans une couche plus près des données (infrastructure, persistence).
Question 4
Vrai ou faux: il faut un repository par objet persisté du domaine.
Faux. Un repository devrait permettre d'accéder à une entité du domaine ex: un porte-feuille d'actions avec ses actions (titres), il n'y aurait pas un repository pour le porte-feuille et un repository pour les titres qui le constituent, il n'y en aurait qu'un seul.
Question 5
Quelle est la différence entre un repository et un DAO? (Si besoin, lire sur le data access object, ex: https://www.baeldung.com/java-dao-pattern)
Le repository est un concept qui appartient au domaine (l'interface) et est situé dans la couche/hexagone du domaine. C'est son implémentation qui est dans la couche de persistance, mais le domaine n'en est pas conscient.
Alors que le DAO est un concept essentiellement de persistance pour en faciliter l'accès et tout cela ne réside PAS dans le domaine même si une interface est employée. Le DAO est généralement (selon les auteurs) un mapping plus direct des tables de la base de données.
De plus, un repository peut faire appel à un ou plusieurs DAO. Exemple pour retourner un objet user, il se peut que le repository doive faire appel à deux DAO qui vont chacun chercher des informations sur le user qui se trouvent dans deux bases de données ou tables différentes. Cela permet d'abstraire le fait que les données pourraient être éparpillées à différents endroits.
Question 6
Est-ce qu'un repository peut en appeler un autre?
Normalement non.
Question 7
Est-ce qu'une implémentation d'un repository doit absolument appeler une base de données?
Non, par exemple si les données proviennent d'un service HTTP extérieur, alors le repository appelerait ce service et non une base de données.
Question 8
Est-ce qu'un repository peut retourner différentes entités du domaine?
Non, un repository ne devrait retourner qu'une seule entité du domaine. Ceci dit, le repository peut offrir différentes façons d'y accéder ex: findXById, findXByName, findXByLastName etc.