Analizamos detenidamente nuestros patrones de aplicaciones web (Java). En el pasado, sufrimos de un modelo de objetos excesivamente anémico y de una separación excesivamente de procedimientos entre los controladores, los servicios y los DAO, con objetos de valor simple (básicamente solo bolsas de datos) que viajaban entre ellos. Hemos utilizado el ORM (Hibernate) gestionado declarativo (XML) para la persistencia. Toda la gestión de la entidad se ha llevado a cabo en DAO.DDD: dónde ubicar la lógica de persistencia y cuándo usar la asignación de ORM
Al tratar de pasar a un modelo de dominio más completo, nos encontramos luchando con la mejor manera de diseñar la capa de persistencia. Pasé mucho tiempo leyendo y pensando en los patrones de diseño impulsados por el dominio. Sin embargo, me gustaría un consejo.
En primer lugar, las cosas que estoy más seguro de:
tendremos controladores "finas" en la parte delantera que se ocupan solamente de HTTP y HTML - formas de procesamiento, validación, la lógica de interfaz de usuario.
Tendremos una capa de servicios lógicos de negocios sin estado que implementa algoritmos comunes o lógica, desconoce la interfaz de usuario, pero muy consciente de (y delegando) el modelo de dominio.
Tendremos un modelo de dominio más completo que contiene estado, relaciones y lógica inherente a los objetos en ese modelo de dominio.
La pregunta se trata de la persistencia. Anteriormente, nuestros servicios se inyectarían (a través de Spring) con DAO y utilizarían métodos DAO como find() y save() para realizar la persistencia. Sin embargo, un modelo de dominio más rico parecería implicar que los objetos deberían saber cómo guardarse y eliminarse, y tal vez que los servicios de nivel superior deberían saber cómo ubicar (consultar) los objetos de dominio.
Aquí, algunas preguntas e incertidumbres surgen:
es lo que queremos para inyectar DAOs en objetos de dominio, por lo que pueden hacer "this.someDao.save (esto)" en un save() ¿método? Esto es un poco incómodo ya que los objetos de dominio no son únicos, por lo que necesitaremos fábricas o configuraciones de DAO posteriores a la construcción. Al cargar entidades desde una base de datos, esto se complica. Sé que Spring AOP se puede usar para esto, pero no pude hacerlo funcionar (usando Play! Framework, otra línea de experimentación) y parece bastante desordenado y mágico.
¿En lugar de eso, mantenemos los DAO (repositorios) completamente separados, a la par de los servicios lógicos de negocios sin estado? Esto puede tener algún sentido, pero significa que si "guardar" o "eliminar" son operaciones inherentes de un objeto de dominio, el objeto de dominio no puede expresarlas.
¿Acabamos de prescindir por completo de los DAO y utilizamos JPA para que las entidades puedan administrarse solos?
Aquí radica la siguiente sutileza: es bastante conveniente mapear entidades usando JPA. ¡El juego! framework nos da una buena clase base de entidad, también, con operaciones como save() y delete(). Sin embargo, esto significa que las entidades de nuestros modelos de dominio están estrechamente vinculadas a la estructura de la base de datos, y estamos pasando objetos con una gran cantidad de lógica de persistencia, tal vez hasta la capa de vista. Si nada más, esto hará que el modelo de dominio sea menos reutilizable en otros contextos.
Si queremos evitar esto, entonces necesitaríamos algún tipo de asignación DAO, ya sea usando JDBC simple (o al menos Spring's JdbcTemplate), o usando una jerarquía paralela de entidades de base de datos y entidades "comerciales", con DAOs siempre copiando información de una jerarquía a otra.
¿Cuál es la opción de diseño adecuada aquí?
Martin
De acuerdo con el diseño impulsado por el dominio - los objetos de dominio deben ser persistentes ignorantes. –