Al usar DDD y CRQS, ¿debe haber exactamente un evento por comando?

17

Estoy buscando una manera de diseñar una aplicación ddd con convención sobre la configuración.

Digamos que un "Cliente" agregado tiene un comando definido "Perfil de relleno". Lógicamente generará un evento "ProfileFilled".

¿Hay casos en que un comando generará más que un evento, o donde un comando generará diferentes eventos basados ​​en alguna lógica? ¿O es esto siempre una relación 1 - 1 (1 comando siempre no generará ninguno, o un solo evento de un tipo dado).

Pregunto esto porque si esto es un hecho, que un comando siempre generará el mismo evento, puedo construir mi sistema de convenciones sobre ese hecho. Sé que "RaiseEvent" dará como resultado "EventRaised" ...

Ludovic C
fuente
1
Si el comando causa que sucedan 2 cosas, puede esperar que cada cosa provoque un evento. ProfileGenerated, ProfileSaved, también cualquier evento puede causar un error que nuevamente puede generar un evento
Ewan
También es posible que los sistemas implementen eventos BeforeCommand, AfterCommand, etc.
Ewan
O el comando podría repetirse, es decir, FillProfiles () profileFilled, profileFilled ....
Ewan
@Ewan, solo quiero corregirte. Un evento de dominio no puede generar un error. Solo los comandos pueden. Los eventos de dominio significan que algo sucedió , ya que los comandos significan que hay una intención de hacer que algo suceda, lo que puede ser rechazado o aceptado. En otras palabras, se debe generar un error antes de que se envíe un evento de dominio (a menos que ese evento de dominio esté relacionado con el registro de errores, por supuesto).
Ludovic C

Respuestas:

18

Dado que etiquetó su pregunta con "CQRS", supongo que se refiere a eventos en un contexto de "CQRS y búsqueda de eventos", como se describe aquí . En este tutorial , la diferencia entre eventos y comandos está bien explicada:

  • los eventos capturan las "cosas que pueden suceder" elementales en su sistema, desde el punto de vista del sistema.

  • los comandos se definen por lo que el usuario considera como una operación, desde su punto de vista

Y aunque esto a menudo conduce a un par de comandos y eventos con una correspondencia 1: 1, estos puntos de vista diferentes pueden conducir a comandos que disparan más de un evento, o diferentes eventos dependiendo de los parámetros del comando. Incluso puedo imaginar casos en los que un comando no genera un evento en absoluto, pero ese sería un caso muy excepcional, no muy típico.

Por ejemplo, el tutorial menciona eventos

  • TabAbierto
  • Bebidas ordenadas
  • Alimentos ordenados

y comandos

  • OpenTab
  • Realizar pedido

Aquí, el comando "OpenTab" conducirá a un evento "TabOpened", pero el comando PlaceOrder llevará a los eventos "DrinksOrdered", "FoodOrdered", o ambos.

De hecho, si está diseñando un nuevo sistema "desde cero", puede intentar diseñarlo con una correspondencia 1: 1 entre comandos y eventos y ver qué tan bien se escala cuando el sistema se hace más grande. Incluso puede probar un enfoque híbrido: una lista de eventos y comandos con una correspondencia 1: 1, junto con algunos comandos combinados adicionales. Simplemente pruebe qué tan lejos lo lleva al sistema particular que está diseñando.

Doc Brown
fuente
10

Por lo general, un comando conducirá a un evento. Pero en algunos casos también puede ser más de uno, depende de su implementación.

Tu comando llama a otros comandos y cada uno de ellos dispara eventos propios. O su comando realiza diferentes tareas por sí mismo y emite múltiples eventos. Por ejemplo:

RegisterUserCommand

  • User.create (correo electrónico, contraseña) → UserCreatedEvent
  • User.updateProfile (firstName, lastName, location) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
sintetizador
fuente
¿Qué pasa si luego decides tener UserWasAddedToCrm? Reescribe toda tu secuencia?
mcintyre321
@ mcintyre321 buscar eventos coreografiados vs eventos orquestados
Benten
10

Un comando puede generar múltiples eventos. Es simplemente la conclusión lógica de un hecho: Composite commandexiste.

Digamos que tiene dos comandos, cada uno de los cuales genera un evento. Luego, crea un comando compuesto de esos dos. Desde el punto de vista de uno que usa el comando compuesto, parece que el comando generó dos eventos.

Por lo tanto, no hay nada que le impida tener un solo comando que genere eventos múltiples (o incluso ninguno).

Eufórico
fuente