No estoy seguro sobre el uso de servicios para esto.
Según tengo entendido, uno de los principios de DDD (que estoy leyendo en este momento) es que los Objetos del Dominio están organizados en Agregados y que cuando se crea una instancia de la raíz del Agregado, puede solo trate directamente con los objetos dentro del Agregado (para ayudar a mantener un claro sentido de responsabilidad).
Creación del agregado debe cumplir cualquier invariantes etc.
Tomando un ejemplo de una clase Cliente, éste podría ser la raíz agregada y otra clase dentro del agregado podrían ser de direcciones.
Ahora, si desea crear un nuevo Cliente, debería poder hacerlo utilizando el constructor del Cliente o una fábrica. Hacer esto debería devolver un objeto que sea completamente funcional dentro del límite Agregado (por lo que no puede tratar con Productos ya que estos no son parte del Agregado pero puede manejar Direcciones).
La base de datos es una preocupación secundaria y solo entra en juego para persistir el Agregado en la base de datos o recuperarla de la base de datos.
Para evitar la interacción con la base de datos directamente, puede crear una interfaz de repositorio (como se explicó) que dado una instancia de Cliente (que incluye una referencia a Dirección) debería poder conservar el Agregado en la base de datos.
El punto es que la interfaz del repositorio ES parte de su modelo/capa de dominio (la implementación del repositorio no lo es). El otro factor es que el repositorio probablemente debería terminar llamando al mismo método de "creación" como si estuvieras creando un nuevo objeto (para mantener invariantes, etc.).Si está utilizando un constructor, esto es bastante simple, ya que terminará llamando al constructor cuando el repositorio "crea" el objeto a partir de datos de todos modos.
La capa de aplicación puede comunicarse directamente con el dominio (incluida la interfaz del repositorio).
Por lo tanto, si desea crear una nueva instancia de un objeto, puede p. Ej.
Customer customer = new Customer();
Si la aplicación necesita para recuperar una instancia del cliente desde el repositorio, no hay ninguna razón en particular que se me ocurre para que no llame ...
Customer customer = _custRepository.GetById(1)
o ...
Customer customer = _custRepository.GetByKey("AlanSmith1")
En última instancia, terminará con una instancia del objeto Cliente que funciona dentro de sus propios límites y reglas como lo haría si creara el nuevo objeto Cliente directamente.
Creo que los servicios deben reservarse para cuando la "cosa" con la que intenta trabajar no es un objeto. La mayoría de las reglas (restricciones, etc.) se pueden escribir como parte del Objeto del Dominio.
Un buen ejemplo está en el DDD PDF rápido que estoy leyendo en este momento. Allí tienen una restricción en un objeto Bookshelf, por lo que solo puede agregar tantos libros como contenga el estante.
Llamar al método AddBook en el objeto BookShelf comprueba que el espacio esté disponible antes de agregar el libro a la colección BookShelf de objetos Book. Un ejemplo simple, pero la regla de negocio es impuesta por el objeto de dominio en sí.
¡No estoy diciendo que alguno de los anteriores sea correcto por cierto! ¡Estoy tratando de entender todo esto en este momento!
De acuerdo. Está "bien" como un ejemplo, supongo, pero estaría bien si mencionaran que no es una buena práctica desde la perspectiva de la arquitectura. –