Quando si usa DDD e CRQS, dovrebbe essere esattamente un evento per comando?

11

Sto cercando un modo per progettare un'applicazione ddd con convenzione sulla configurazione.

Diciamo che un "Cliente" aggregato ha un comando definito "FillProfile". Risolverà logicamente un evento "ProfileFilled".

Ci sono casi in cui un comando genererà più di un evento o dove un comando genererà eventi diversi in base ad una logica? Oppure è sempre una relazione 1 - 1 (1 comando non genererà mai nessuno, o un singolo evento di un dato tipo).

Te lo chiedo perché se questo è un fatto, che un comando genererà sempre lo stesso evento, posso costruire il mio sistema di convenzioni su questo fatto. So che "RaiseEvent" avrà come risultato "EventRaised" ...

    
posta Ludovic C 20.12.2015 - 23:32
fonte

3 risposte

14

Dato che hai taggato la tua domanda con "CQRS", suppongo che intendi eventi in un contesto "CQRS & Event Sourcing", come se fosse descritto qui . In questo tutorial , la differenza tra eventi e comandi è ben spiegata:

    Gli eventi
  • catturano le elementari "cose che possono accadere" nel tuo sistema, dal punto di vista del sistema.

  • I comandi
  • sono definiti da ciò che l'utente considera come un'operazione, dal suo punto di vista

Anche se questo spesso porta a un paio di comandi ed eventi con una corrispondenza 1: 1, questi diversi punti di vista possono portare a comandi che generano più eventi o eventi diversi a seconda dei parametri del comando. Posso persino immaginare casi in cui un comando non genera un evento, ma sarebbe un caso eccezionale, non molto tipico.

Ad esempio, il tutorial menziona gli eventi

  • TabOpened
  • DrinksOrdered
  • FoodOrdered

e comandi

  • OpenTab
  • PlaceOrder

Qui, il comando "OpenTab" porterà a un evento "TabOpened", ma il comando PlaceOrder porterà agli eventi "DrinksOrdered", "FoodOrdered" o entrambi.

In effetti, se stai progettando un nuovo sistema "da zero", puoi provare a progettarlo con una corrispondenza 1: 1 tra i comandi e gli eventi e guardare quanto bene si ridimensiona quando il sistema diventa più grande. Puoi anche provare un approccio ibrido: un elenco di eventi e comandi con una corrispondenza 1: 1, insieme ad alcuni comandi combinati aggiuntivi. Prova solo fino a che punto ti porta per il particolare sistema che stai progettando.

    
risposta data 21.12.2015 - 14:21
fonte
9

Normalmente un comando porterà a un evento. Ma in alcuni casi può anche essere più di uno, dipende dalla tua implementazione.

O il tuo comando chiama altri comandi e ognuno di essi licenzia i propri eventi. Oppure il tuo comando esegue diverse attività per conto proprio e genera più eventi. Ad esempio:

RegisterUserCommand

  • User.create (email, password) → UserCreatedEvent
  • User.updateProfile (firstName, lastName, posizione) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
risposta data 21.12.2015 - 00:21
fonte
9

Un comando può generare più eventi. È semplicemente la conclusione logica di un fatto: Composite command esiste.

Diciamo che hai due comandi, ognuno dei quali innalza un evento. Quindi, si crea un comando composto di questi due. Dalla vista di uno che usa il comando composito, sembra che il comando abbia generato due eventi.

Quindi non c'è nulla che ti impedisca di avere un singolo comando che genera eventi multipli (o addirittura no).

    
risposta data 21.12.2015 - 11:37
fonte

Leggi altre domande sui tag