pattern patron example entre driven domain diferencia and domain-driven-design dao repository

domain driven design - patron - DAO, Repositorios y Servicios en DDD



java repository pattern vs dao (3)

Los repositorios son interfaces para almacenar y recuperar raíces agregadas (AR) , no entidades individuales. Tienes un repositorio para cada AR de tu modelo de dominio.

Según el patrón de repositorio de Fowler, los repositorios actúan como una colección de objetos en memoria y esta es una de las principales diferencias en comparación con los DAO.

Las interfaces de los repositorios son un medio para que el cliente del Modelo de Dominio (y por lo tanto sean parte del Modelo de Dominio) para comenzar a trabajar con el Modelo de Dominio. Los clientes tienen la intención de obtener una instancia de AR de un Repositorio, invocar algún método, que generalmente modifica su estado interno y luego almacenarlo de nuevo en el Repositorio.

Después de leer varios artículos, estoy empezando a entender la diferencia entre DAO y los Repositorios, pero me encuentro en problemas tratando de entender la diferencia entre los Repositorios y los Servicios.

Para poner en términos cortos, en el paradigma OO:

  • DAO : Clase que contiene las CRUD operations básicas para una clase de entidad. Tiene el código necesario para obtener o recuperar elementos del sistema de almacenamiento persistente subyacente. En términos generales, los métodos reciben entidades de objeto como parámetros, excepto en el método de retrieve donde es válido usar un tipo de identificador.

  • Repositorios : en un nivel más alto de abstracción ... ya que generalmente he leído es un tipo de lugar donde colocar código que maneja operaciones sobre objetos agregados (objetos que tienen objetos secundarios). Utiliza los DAO para recuperar objetos de la base de datos y, al final, expone una interfaz en el lenguaje "de negocios" del dominio. (Pero, una vez más, creo que es muy válido usar tipos de datos de identificadores). Ejemplo: un addSomething muy simple donde something es un objeto secundario del padre cuyas instancias, por cierto, son administradas en conjunto por el Repositorio.

  • Servicios : De nuevo, se encuentra en un nivel más alto de abstracción. Para mi humilde punto de vista, son un buen lugar para conectar dos clases que no comparten una relación padre-hijo, pero están tan lejos (en términos de abstracción) como el Repositorio. Ejemplo: El método transferCash entre dos bank accounts .

Por lo tanto, esas son mis lecturas, pero estoy preguntando aquí que los pensamientos anteriores son correctos o no. O cómo debería pensar. O algo que me apunte a entender realmente la diferencia de todos estos conceptos.

Algunas de las fuentes:


Los repositorios son, como usted dice, una abstracción. Se originan en el patrón de consulta de objetos de Martin Fowler. Tanto los repositorios como los DTO pueden simplificar la persistencia de la base de datos mediante el mapeo de los datos persistentes en una colección equivalente de objetos de entidad. Sin embargo, los Repositorios son más precisos que los DAO al proporcionar el control de toda una Raíz Agregada (AG) que a menudo oculta una gran cantidad de estado interno del cliente. Por otro lado, los DAO pueden ser tan específicos como estar dedicado a un solo objeto de entidad. Tanto para los Repositorios como para los DAO, es común usar Hibernate u otros Marcos de Objeto / Mapeo Relacional (ORM) en lugar de escribir su propia implementación.

Normalmente, los servicios pueden residir en una capa de servicio y pueden actuar como una fachada de funcionalidad, capa anticorrupción y coordinador para almacenamiento en caché y transacción. A menudo son un buen lugar para llevar a cabo la tala. Servicios de grano grueso y orientados al uso de casos, por ejemplo, Service.updateCustomerAdress() o Service.sendOrder() . Los repositorios pueden ser demasiado específicos para que los clientes los consuman, por ejemplo, Customer.add(…) , Order.modify(…) .

Los repositorios y los DAO tienen el mismo propósito: conservar los datos de forma permanente. Los servicios de la otra parte deben ignorar la persistencia y no tener conocimiento de su base de datos. Por lo general, trabajan estrechamente junto con los servicios de dominio, los repositorios, el núcleo del dominio.


No estoy seguro de qué es "DAO". Los repositorios son una abstracción para cargar entidades. Deberías poder obtener una entidad y guardar una, eso es todo. Sin consultas. Si desea consultar algunos datos, escriba una consulta (tal vez incluso dentro de un método de acción MVC, o con las abstracciones más simples y simples que permiten ejecutar algunos SQL y devolver algunos DTO que se pueden representar directamente en el HTML).

Los servicios por otro lado son complicados. Para empezar el término está sobrecargado. Los "servicios de aplicaciones" definidos por el libro de DDD por Eric Evans existen porque los objetos en el Modelo de dominio no pueden acceder a problemas de infraestructura como bases de datos, mensajes, almacenamiento en caché, etc. Necesitan todo eso y se los entregan en una placa, y los servicios de aplicación hacen precisamente eso. Los Servicios de Aplicación, por su parte , no contienen ninguna lógica . No esperaría ver a ICustomerService.ChangeAddress() hacer otra cosa que no sea:

  1. Cargar la entidad cliente.
  2. Call Customer.ChangeAddress(newAddress) <: esto encapsula la lógica del dominio
  3. Guardar el cliente.
  4. Tal vez publicar algunos eventos.

Si tiene un servicio que está cargando a un cliente, configurando su propiedad de Dirección y guardándolo, entonces ese servicio es en realidad un Script de Transacción y el Cliente es un DTO. Lo que significa que definitivamente tiene una abstracción con fugas y es probable que tenga un modelo de dominio anémico. Los objetos del modelo de dominio no deben tener definidores públicos, y cuando DDD se combina con CQRS, es posible que su modelo de dominio no tenga ningún estado público más allá de los valores de ID de entidad principal.