DDD: ¿Dónde colocar controladores de eventos de dominio?

13

¿Podría decirme su opinión de qué capa es la correcta para colocar controladores de eventos de dominio en DDD? Por ejemplo, tengo un servicio de aplicación para agregar un nuevo contrato y me gustaría enviar una notificación por correo electrónico a la persona de contacto, cuando el contrato se haya agregado, también lo es el servicio de aplicación o servicio de dominio del remitente del correo electrónico (que maneja el evento ContractAdded) o ¿algo más?

Toni
fuente

Respuestas:

12

Coloco controladores de eventos de dominio en la capa de aplicación.

El evento de dominio es una forma de decirle a las capas externas (o al mundo exterior) que algo sucedió en la capa de dominio. Qué hacer con el evento depende de la aplicación. La aplicación puede notificar al usuario sobre los cambios o puede llamar a otro dominio para hacer algo. La aplicación es responsable de organizar las operaciones de dominio en reacción a las acciones del usuario, solicitudes web o eventos de dominio.

Eugene Khudoy
fuente
1
+1 para la capa de aplicación. En un diseño pub-sub, el evento de dominio puede activar la lógica genérica en diferentes lugares / sistemas / microservicios. Si uno de los suscriptores es una aplicación modelada usando DDD, el evento está activando algún procesamiento en esa aplicación / BC. Este procesamiento puede requerir demarcación de transacciones, control de acceso, coordinación que generalmente se realiza en la capa de aplicación.
Paulo Merson
2

El libro original DDD (Evans 2004) explica la capa de aplicación como una capa delgada que ejercita objetos de dominio en respuesta a la acción del usuario. Los controladores de eventos típicos para eventos de dominio, por lo tanto, no pertenecen a la capa de aplicación.

Puede tener sentido colocar algunos de ellos en la capa de dominio, siempre que no rompa las capas creando una dependencia ascendente.

Si tiene una capa de infraestructura que está debajo de la capa de dominio, el controlador de eventos no puede estar allí, ya que rompería las capas.

Si tiene una capa de adaptadores que está por encima de la capa de dominio, puede crear un controlador de eventos allí. Echa un vistazo a la arquitectura hexagonal .

Gudmundur Orn
fuente
2

Coloco controladores de eventos de dominio en la capa de dominio como interfaz de dominio IDomainEventHandler.

Un ejemplo de un controlador de eventos de dominio es una política que se suscribe a cierto evento de dominio para inicializar una nueva transacción (por ejemplo: para activar un nuevo comando de dominio), por lo tanto, tiene sentido tenerlo en la capa de dominio ya que está relacionado con lógica de negocios.

Podríamos pensar en un ejemplo en el que se confirma un pedido y, por lo tanto, se debe crear una solicitud de factura. Tenemos un evento OrderConfirmedEventque ha sucedido. Una política en nuestro dominio se encargaría de suscribirse a este evento y crear un comando de dominio RequestInvoiceque será manejado por el controlador de comandos y que se tratará en consecuencia.

Si tuviéramos este controlador de eventos en la capa de aplicación, significaría que la capa de aplicación, además de orquestar las acciones del usuario, ejecutaría cierta lógica empresarial, lo que parece incorrecto.

Sin embargo tenemos

diegosasw
fuente