Sé que la lógica del dominio debe colocarse en objetos de dominio. Pero, ¿qué pasa si mi lógica de dominio necesita datos de la base de datos? (por ejemplo, comprobar el valor único, los valores calculados ... etc.) Creo que inyectar repositorios en los objetos de mi dominio no es lo correcto. Además, la capa de servicio no debe contener reglas comerciales. Entonces, ¿cómo resolver este tipo de lógica de negocios?Dónde poner la lógica de dominio que necesita recuperar datos de la base de datos
Respuesta
Tiene razón, su objeto de dominio no debería leer los datos directamente de la base de datos. El error clásico aquí es que el objeto de dominio se envía a través de un servicio web e intenta leer datos de la base de datos cuando está en un servidor sin acceso a la base de datos.
Hay varias maneras de hacer esto:
- un servicio precargas capa cualquier información que el objeto de dominio necesitará
- el objeto de dominio puede llamar a un ayudante o repositorio que obtiene los datos de la base de datos
siempre he encontrado la capa de servicio a ser un lugar lógico para invocar este tipo de actividad - pero como voy a explicar, que no es donde me puso en práctica, per se. Dado que la capa de servicio es su puerta de acceso al dominio, tiene la seguridad de que cualquier solicitud que inicie la necesidad de estos datos, tendrá que pasar por este punto para llegar allí.
Además, tener servicios hablar con otros servicios es muy limpio, ya que están diseñados específicamente para requerir un mínimo esfuerzo para invocar. Puede exponer la funcionalidad adecuada que necesita en los repositorios (es decir, un método/buscador/consulta que podría darle el conteo de objetos X que coinciden con los criterios Y) y envolverlo en una llamada de servicio útil. Esto no solo le brinda más poder para realizar tareas fácilmente dentro de un solo servicio, sino que también puede aprovechar esta funcionalidad entre servicios para requisitos más complejos.
Entiendo el tipo de preocupación acerca de poner lógica de negocios en la capa de servicio, pero dependiendo de los requisitos, es una línea fina entre lo que es lógica de negocios y lo que es la lógica de negocios específica de la implementación. Al escribir un sistema, a menudo surgen reglas que están implícitas como lógicas de negocios, pero que simplemente no encajan. Las restricciones únicas son lo que he encontrado para ser el ejemplo más común. Recuerde, al igual que todo lo demás en el repositorio, esto no es una implementación en la capa de servicio, sino que es una abstracción de lo que ya está en el dominio.
Lo que hago es colocar la "lógica" en sí en el dominio, generalmente en la forma de una implementación de patrón de especificación. Dado que la lógica se ejecuta en el repositorio y no requiere que se cambie la capa de servicio, he llegado a un acuerdo con esto siendo completamente aceptable. Encontrará que las reglas que se aplican a colecciones de entidades suelen ser las "divertidas". Si solo necesita verificar que algo es único con una colección dentro de la raíz agregada, es lo suficientemente simple de hacer.
He visto enfoques donde el objeto de dominio tiene conocimiento del repositorio, y personalmente no soy un fan. El repositorio, para mí, es la definición de cómo el dominio se conectará con la capa de persistencia (aunque no siempre la implementación). El hecho de que una entidad incluso tenga conocimiento de que tiene un propósito mayor que simplemente existir complica las cosas inmensamente.
- 1. ¿Dónde poner la base de datos de información sensible
- 2. CakePHP - dónde poner la lógica del servicio
- 3. Dónde poner la lógica de negocio en Django
- 4. Lógica de dominio vs validación de datos
- 5. Cómo tratar con un objeto de valor que necesita buscar datos en la base de datos
- 6. dónde poner la lógica de validar? En servicio o repositorio?
- 7. interfaz de usuario, capa de lógica de negocios, capa de datos y dónde poner servicios web
- 8. ¿Dónde escribir la lógica de base de datos y negocios en MVC?
- 9. Recuperar esquema de base de datos
- 10. Controlador QSQLITE no cargado: dónde poner los complementos del controlador de la base de datos qt
- 11. Necesita una base de datos de sinónimos
- 12. Tener problemas para poner la lógica del mundo real en la capa de dominio DDD
- 13. Dónde poner el estado de la aplicación?
- 14. ¿Dónde está la base de datos de tipo iPhone MIME?
- 15. Componentes internos de la base de datos: ¿por dónde empezar?
- 16. ¿Dónde debería poner la clase base vacía?
- 17. ¿dónde almacena MySQL los archivos de la base de datos?
- 18. ¿Dónde puedo descargar la base de datos Mysql de muestra?
- 19. ¿Dónde almacena contraseñas de base de datos?
- 20. ¿Dónde colocar código de manipulación de datos y lógica de negocios en la aplicación ASP.NET MVC?
- 21. Copia de datos relacionales de la base de datos a la base de datos
- 22. Análisis de datos XML utilizando php para poner en la base de datos mysql
- 23. recuperar datos de linkedgeodata.org
- 24. Java: ¿dónde debería poner código de lógica de oyente anónimo?
- 25. ¿Dónde puedo descargar la base de datos Northwind para Postgresql?
- 26. cómo recuperar datos de la base de datos SQL en Word 2010?
- 27. Cómo recuperar datos de la base de datos sqlite en android y mostrarlos en TextView
- 28. ¿Cómo puedo recuperar los datos del mes específico de la base de datos SQLite?
- 29. Lógica: base de datos o aplicación/2 (comprobación de restricciones)
- 30. ¿Dónde está la base de datos Oracle Bug?
Personalmente, prefiero el segundo enfoque. Otro punto importante para mencionar es que el repositorio debe abstraerse para que los objetos/capa de dominio no estén estrechamente relacionados con el repositorio. –