DAO y el patrón de repositorio son formas de implementar Data Access Layer (DAL). Entonces, comencemos con DAL, primero.
Las aplicaciones orientadas a objetos que acceden a una base de datos, deben tener cierta lógica para manejar el acceso a la base de datos. Para mantener el código limpio y modular, se recomienda que la lógica de acceso a la base de datos se aísle en un módulo separado. En la arquitectura en capas, este módulo es DAL.
Hasta ahora, no hemos hablado de ninguna implementación en particular: solo un principio general que pone la lógica de acceso a la base de datos en un módulo separado.
Ahora, ¿cómo podemos implementar este principio? Bueno, una forma conocida de implementar esto, en particular con marcos como Hibernate, es el patrón DAO.
El patrón DAO es una forma de generar DAL, donde típicamente, cada entidad de dominio tiene su propio DAO. Por ejemplo, User
y UserDao
, Appointment
y AppointmentDao
, etc. Un ejemplo de DAO con Hibernate: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html .
Entonces, ¿qué es el patrón de repositorio? Al igual que DAO, el patrón de repositorio también es una forma de lograr DAL. El punto principal en el patrón de repositorio es que, desde la perspectiva del cliente / usuario, debe verse o comportarse como una colección. Lo que significa comportarse como una colección no es que tenga que ser instanciado como Collection collection = new SomeCollection()
. En cambio, significa que debe admitir operaciones como agregar, eliminar, contiene, etc. Esta es la esencia del patrón de repositorio.
En la práctica, por ejemplo, en el caso de utilizar Hibernate, el patrón de repositorio se realiza con DAO. Esa es una instancia de DAL puede ser a la vez una instancia del patrón DAO y el patrón de repositorio.
El patrón de repositorio no es necesariamente algo que uno construye sobre DAO (como algunos pueden sugerir). Si los DAO están diseñados con una interfaz que admite las operaciones mencionadas anteriormente, entonces es una instancia del patrón de Repositorio. Piénselo, si los DAO ya proporcionan un conjunto de operaciones tipo colección, ¿cuál es la necesidad de una capa adicional encima?
IRepository
interfaz. Desea que su repositorio use DAO en su implementación. Recuerde, un DAO será un objeto por tabla, mientras que un Repositorio casi siempre tendrá que usar múltiples DAO para construir una sola Entidad. Si considera que ese no es el caso, que su Repositorio y Entidad solo necesitan acceder a una sola tabla, entonces lo más probable es que esté creando un dominio anémico.