Leyendo la literatura de DDD se me ocurrieron las siguientes capas:
ApplicationOutsider World (Controladores, Crons, etc.)Application Services(o UseCases), que organiza múltiples servicios de dominio o servicios de infraestructura. Son llamados deOutside World. Ellos saben que cosas hay que hacerDomain Services- que contiene cómo se hacen las cosas (confiando en las interfaces del repositorio)
Pregunta : ¿Existe alguna práctica recomendada para comunicarse entre capas?
Lo que sé: Application servicesdebería devolver los "datos deseados" para exponerlos y parte del "éxito" de la transacción (advertencias, errores, informaciones). Los datos que Application Servicedevuelve deben recopilarse Domain Servicesy / o Infrastructure Servicescompilarse juntos.
Controller <-> Application Service <-> Domain Service
<-> Infrastructure Service
Estos son algunos de mis pensamientos ambiguos:
¿Todos los métodos
Application Servicedeben tener un DTO específico que contenga la "solicitud" como parámetro? Me gustaAddItemToCardCommandDto(que encapsula todos los datos necesarios). ¿Qué tal un genéricoResultObjectque solo tiene un par de métodos comogetResultyhasErrorrsogetMessages?¿Cómo se deben devolver los
DomainServicedatos y los errores? ¿Deberían devolver errores por excepción? Eso parece extraño porque para mí la validaciónDomainServicesde negocios debería llamarse ya que son parte de las reglas comerciales.