He escuchado mucho sobre el patrón del repositorio, pero no entendí lo que un repositorio realmente debería hacer. Cuando digo "qué debería hacer realmente un repositorio", me preocupan principalmente los métodos que debe proporcionar. Por ejemplo, ¿debería un repositorio realmente proporcionar métodos CRUD, o debería proporcionar algún tipo diferente de método?
Quiero decir, ¿deberían los repositorios contener lógica de negocios, o simplemente deberían contener la lógica para comunicarse con el almacén de datos y administrar las entidades que se guardarán o cargarán?
También he oído que los repositorios son unidades de persistencia para los agregados. Pero como es eso? No entiendo cómo funciona esto en la práctica. Pensé que deberíamos tener una sola interfaz IRepository
que contenga los métodos CRUD, y luego, para cualquier entidad, la implementación simplemente contendría la lógica para guardar y recuperar ese tipo del almacén de datos.
fuente
Respuestas:
Bueno, puede ver un buen ejemplo en Spring Data Framework que se basa en el concepto de repositorios.
Allí verá que los repositorios solo se ocupan del almacén de datos y rara vez contienen lógica empresarial (esto está reservado para la capa de servicio). Entonces, por ejemplo, si observa su diseño, verá que tienen una interfaz CRUDRepository que expone métodos para crear, destruir y recuperar entidades (entre otras cosas). También hay un PagingAndSortingRepository que agrega funcionalidad adicional para precisamente eso, ordenar y buscar resultados, etc.
Entonces, este marco es quizás un buen lugar para estudiar un buen diseño de repositorio.
Hasta donde yo sé, muchos de los conceptos implementados por Spring Data Framework provienen de un gran libro llamado Diseño impulsado por dominio: abordar la complejidad en el corazón del software , el libro tiene una sección completa dedicada al diseño de repositorio.
Puede considerar obtener una copia del mismo.
Un pequeño extracto del libro explica:
fuente
No debe proporcionar una interfaz CRUD directa ni lógica empresarial. Media entre la lógica de negocios y la base de datos. La interfaz debe estar en términos de lógica de negocios pero no realizar la lógica de negocios en sí, más como una primitiva de lógica de negocios. Como ejemplo, digamos que iba a construir un sistema de correo electrónico, tiene usuarios y mensajes. Su repositorio proporcionaría operaciones CRUD básicas para usuarios y mensajes, pero también proporcionaría vistas filtradas de mensajes como GetUsersNewMessages (usuario) o GetSearchedMessages (usuario, términos de búsqueda).
La idea es que el Repositorio oculta cómo se implementa el almacenamiento y proporciona una interfaz limpia que permite un acceso rápido y flexible a los datos. Mantener las operaciones en términos de alto nivel de lo que debería suceder en lugar de cómo significa que tiene más flexibilidad para implementarlas de la manera que sea mejor para la tienda de respaldo subyacente.
fuente