En el diseño controlado por dominio, la capa de dominio puede tener varios servicios (tradicionales). Por ejemplo, para el dominio de Usuario, podemos tener:
- Una fábrica de usuarios, que construye objetos de usuario de diferentes maneras
- Un UserRepository, que es responsable de interactuar con los servicios de persistencia en la capa de infraestructura
¿Es un Servicio de Usuario en la Capa de Dominio simplemente un Mediador y / o Fachada para esos dos servicios y la Capa de Infraestructura, o hay más?
Respuestas:
Domain services
se describen mejor por lo que no son:Entities
niAggregate roots
Value objects
Entity
o unoValue object
Un ejemplo de a
Domain service
es aSaga/Process manager
: coordina un proceso de larga duración que involucra múltiplesAggregate roots
, posibles desde diferentesBounded contexts
.Dicho esto, lo que es un
Domain service
y cómo se implementa son dos cosas ortogonales.Algunos servicios de dominio como un
UserRepository
(compuesto por una interfaz definida en elDomain layer
y una implementación concreta en elInfrastructure layer
) pueden implementarse utilizando elFacade
patrón de diseño. Otros servicios de dominio no lo son.No hay una regla estricta sobre cómo implementarlos, aparte de la regla importante de que
Domain layer
no debe depender de otras capas (y SÓLIDO ).fuente
Veo servicios en DDD como resultado de la Inversión de dependencia .
Si usara dependencias "simples", entonces su código de dominio llamaría a la base de datos para guardar o consultar una entidad, o fábrica, que crea una entidad, que está vinculada a la base de datos o servicio externo o algún otro tipo de código de infraestructura.
Pero no es así como debería ser el código de dominio. El código de dominio no debe depender del código de infraestructura. Como esta dependencia dificulta la prueba y, posiblemente, la reutilización. Es por eso que inviertes esa dependencia. Hace que el código de infraestructura dependa del código de dominio. Y para hacer eso, necesitas introducir una abstracción. Una abstracción que define qué comportamiento el código de dominio espera que la infraestructura implemente.
Y los servicios en DDD son esa abstracción. En la mayoría de los casos, para el código de dominio, esos servicios deben ser interfaces simples. Y la implementación debe estar en el código de infraestructura, que depende de esas interfaces.
fuente