2011-01-08 23 views
6

Al implementar eventos de dominio, los controladores de eventos solo se deben usar para problemas de dominio; algo que discutirías con los expertos en negocios, o ¿están abiertos para ser utilizados por cualquier cosa que tenga interés en el modelo de dominio?Controladores de eventos de dominio: ¿deberían usarse para las preocupaciones de la capa de aplicación?

Esto probablemente se explica mejor con un ejemplo simple, considere una aplicación de calendario para programar el trabajo para los empleados.

Podríamos tener los siguientes eventos de dominio ...

AppointmentAdded AppointmentRemoved AppointmentContentChanged AppointmentMoved

Tenemos controladores de estos eventos, por ejemplo, cuando una cita se traslada a un tiempo fuera de los empleados Horas de trabajo configuramos una bandera de advertencia.

Por supuesto, hay inquietudes sobre aplicaciones que están interesadas en estos eventos, p. cuando se agrega una Cita al calendario, debemos agregarla a la Unidad de trabajo para que podamos enviar los cambios más tarde.

¿Deberían estas aplicaciones ser consumidores de los eventos de dominio, o deberíamos plantear y manejar eventos de sistema separados en su lugar?

Respuesta

5

Existen dos formas bien establecidas de utilizar eventos en una solución DDD.

El primero se basa en el articles about events de Udi Dahan. Si no los ha leído ya, lo recomiendo encarecidamente. En resumen, dice que publica sus eventos usando la clase estática además de comportamiento normal de estilo ORM. Para agregar un pedido a la colección de pedidos del cliente y, publique el evento. Debido a que el comportamiento de su dominio se ejecuta dentro de un alcance de transacción, también lo son los manejadores de eventos. También puede encontrar allí y consejos para no adjuntar objetos manualmente a una Unidad de trabajo. Se deben crear nuevas raíces agregadas invocando el comportamiento en las existentes.

Hay otra opción promovida por Greg Young. Se basa en el aprovisionamiento de eventos que básicamente utiliza eventos como medio de estado persistente. En este enfoque, sus raíces agregadas usualmente utilizan cierta infraestructura (por ejemplo, clase de raíz agregada base) para aplicar eventos. Aplicar invoca un controlador de eventos en la clase de raíz agregada y publica este evento en un bus (cualquiera que sea la implementación de bus que utilice).

+3

Dudo que promuevan el manejo de eventos en la misma transacción que el agregado que está activando ese evento. Como recuerdo, Udi especifica que es mejor "disparar y olvidarse" por encima de la transacción agregada, especialmente en los casos en que los manejadores de eventos no tienen nada que ver con el dominio (por ej .: mensajes de correo electrónico). "Disparar y olvidar" significa que no te importa si el oyente recibió el mensaje, pero debes preocuparte por cuándo disparar un mensaje (envía el mensaje). Envía un mensaje después de que el agregado haya terminado su trabajo: cambio de estado + persistencia. Así que procuro lanzar un evento después de la persistencia. – Tudor

+2

P.S. El agregado puede disparar un evento en cualquier momento, pero la entrega real del mensaje debe manejarse después de la persistencia agregada (o después de que un comando específico, que desencadenó el evento, haya finalizado). – Tudor

2

Si se refiere a problemas transversales, se verá obligado a utilizarlo de todos modos si la lógica de su aplicación así lo requiere. Por lo tanto, se mezclará con otro código de procesamiento de eventos.

Pero si necesita hacer varias cosas independientes cuando se produce el evento de su dominio, es mejor utilizar controladores de eventos separados (consulte el principio de Separación de preocupaciones).

En el primer caso, dicho sea de paso, intente evitar mezclar lógica de dominio con lógica de procesamiento de eventos (infraestructura). Infraestructura izquierda/código de preocupaciones transversales en controladores de eventos que llaman a métodos de dominio. Mover el código de dominio dentro de los métodos de los objetos de dominio.

+0

esto suena razonable, pero lleva a una nueva pregunta sobre cuándo plantear los eventos del dominio. Digamos que agregar una cita al calendario se realiza en una transacción, agregar la entidad a un UnitOfWork debe realizarse dentro de la transacción, pero la actualización de la UI debe realizarse fuera de la transacción. En este caso, ¿el evento de dominio debe plantearse dentro de la transacción?y la actualización de UI debe hacerse en otro controlador de eventos de dominio que hace su trabajo Async. – Andronicus

+1

El evento de dominio representa algo que ya sucedió. Por lo tanto, no debería haber capacidad para deshacer una transacción dentro del controlador de eventos. Confirme la transacción y luego llame a los controladores de eventos para todos los eventos enviados durante la transacción. –

Cuestiones relacionadas