Les modèles DAO et Repository sont des moyens d'implémenter la couche d'accès aux données (DAL). Commençons donc par la couche d'accès aux données.
Les applications orientées objet qui accèdent à une base de données, doivent avoir une certaine logique pour gérer l'accès à la base de données. Afin de garder le code propre et modulaire, il est recommandé d'isoler la logique d'accès à la base de données dans un module séparé. Dans l'architecture en couches, ce module est le DAL.
Jusqu'à présent, nous n'avons pas parlé d'une implémentation particulière : seulement d'un principe général qui consiste à placer la logique d'accès aux bases de données dans un module séparé.
Maintenant, comment pouvons-nous mettre en œuvre ce principe ? Eh bien, une façon connue de le mettre en œuvre, en particulier avec des frameworks comme Hibernate, est le modèle DAO.
Le modèle DAO est une façon de générer un DAL, où typiquement, chaque entité de domaine a son propre DAO. Par exemple, User
y UserDao
, Appointment
y AppointmentDao
etc. Un exemple de DAO avec Hibernate : http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html .
Alors qu'est-ce que le modèle de référentiel ? Comme DAO, le modèle Repository est aussi un moyen de réaliser DAL. Le point principal du modèle Repository est que, du point de vue du client/utilisateur, il doit ressembler ou se comporter comme une collection. Ce que l'on entend par se comporter comme une collection n'est pas qu'elle doit être instanciée comme Collection collection = new SomeCollection()
. Au contraire, cela signifie qu'il doit supporter des opérations telles que l'ajout, la suppression, le contenu, etc. C'est l'essence même du modèle Repository.
Dans la pratique, par exemple dans le cas de l'utilisation d'Hibernate, le pattern Repository est réalisé avec DAO. C'est-à-dire qu'une instance de DAL peut être à la fois une instance du pattern DAO et du pattern Repository.
Le modèle de référentiel n'est pas nécessairement quelque chose que l'on construit au-dessus de DAO (comme certains peuvent le suggérer). Si les DAO sont conçus avec une interface qui supporte les opérations mentionnées ci-dessus, alors il s'agit d'une instance du modèle Repository. Pensez-y, si les DAO fournissent déjà un ensemble d'opérations de type collection, alors quel est le besoin d'une couche supplémentaire par-dessus ?