A pesar de haber estudiado Domain Driven Design
durante mucho tiempo, todavía hay algunos conceptos básicos que simplemente entiendo.Tener problemas para poner la lógica del mundo real en la capa de dominio DDD
Parece que cada vez que intento de diseñar una rica domain layer
, todavía necesita una gran cantidad de Domain Services
o una gruesa Application Layer
, y termino con un grupo de entidades del dominio casi anémicos sin una lógica real en ellos, aparte de "GetTotalAmount" y similares. La cuestión clave es que las entidades no son conscientes de las cosas externas, y es una mala práctica inyectar algo en las entidades.
te voy a dar algunos ejemplos:
1. Un usuario se registra para un servicio. El usuario persiste en la base de datos, se genera y guarda un archivo (necesario para la cuenta de usuario) y se envía un correo electrónico de confirmación.
El ejemplo con el correo electrónico de confirmación se ha discutido ampliamente en otros hilos, pero sin una conclusión real. Algunos sugieren poner la lógica en un application service
que obtiene un EmailService
y FileService
inyectado desde el infrastructure layer
. Pero luego tendría lógica de negocios fuera del dominio, ¿verdad? Otros sugieren la creación de un domain service
que tiene la infrastructure services
inyecta - pero en ese caso, tendría que tener las interfaces del infrastructure services
dentro del domain layer
(IEmailService
y IFileService
), que no se ve muy bien ya sea (porque el domain layer
no se puede hacer referencia a la infrastructure layer
) . Y otros sugieren implementar Udi Dahan's Domain Events y luego tener el servicio de correo electrónico y FileService suscribirse a esos eventos. Pero eso parece una implementación muy flexible, ¿y qué pasa si los servicios fallan? Por favor, hágame saber cuál cree que es la solución correcta aquí.
2. Una canción se compra en una tienda de música digital. El carrito de compras está vacío. La compra es persistente. El servicio de pago se llama. Se envía una confirmación por correo electrónico.
Ok, esto podría estar relacionado con el primer ejemplo. La pregunta aquí es, ¿quién es el responsable de orquestar esta transacción? Por supuesto, podría poner todo en el controlador MVC con servicios inyectados. Pero si quiero una DDD real, toda la lógica de negocios debería estar en el dominio. Pero, ¿qué entidad debe tener el método de "Compra"? Song.Purchase()
? Order.Purchase()
? OrderProcessor.Purchase()
(servicio de dominio)? ShoppingCartService.Purchase()
(servicio de aplicación?)
Este es un caso en el que creo que es muy difícil utilizar la lógica comercial real dentro de las entidades de dominio. Si no es una buena práctica inyectar algo en las entidades, ¿cómo pueden hacer otra cosa que no sea verificar su propio estado (y el de su agregado)?
Espero que estos ejemplos sean lo suficientemente claros como para mostrar los problemas que estoy tratando.
DDD sugiere hacer que las entidades 'File' y' Email' formen parte del dominio.La infraestructura es responsable de generar un archivo y enviar un correo electrónico cuando las entidades correspondientes aparecen en la capa de dominio. – Lightman