Lorsque vous utilisez DDD et CRQS, devrait-il y avoir exactement un événement par commande?

17

Je cherche un moyen de concevoir une application ddd avec une convention sur la configuration.

Supposons qu'un agrégat "Client" possède une commande définie "FillProfile". Il déclenchera logiquement un événement "ProfileFilled".

Y a-t-il des cas où une commande déclenchera plus qu'un événement, ou où une commande déclenchera différents événements en fonction d'une logique? Ou s'agit-il toujours d'une relation 1 - 1 (1 commande n'en déclenchera toujours aucune, ou un seul événement d'un type donné).

Je pose cette question parce que si c'est un fait, qu'une commande déclenchera toujours le même événement, je peux construire mon système de convention sur ce fait. Je sais que "RaiseEvent" se traduira par "EventRaised" ...

Ludovic C
la source
1
si la commande provoque 2 événements, vous pouvez vous attendre à ce que chaque événement déclenche un événement. ProfileGenerated, ProfileSaved, De plus, tout événement peut provoquer une erreur qui peut à nouveau déclencher un événement
Ewan
Les systèmes peuvent également implémenter les événements BeforeCommand, AfterCommand, etc.
Ewan
Ou la commande peut boucler, c.-à-d. FillProfiles () profileFilled, profileFilled ....
Ewan
@Ewan, je veux juste vous corriger. Un événement de domaine ne peut pas générer d'erreur. Seules les commandes le peuvent. Les événements de domaine signifient que quelque chose s'est produit , car les commandes signifient qu'il y a une intention de faire quelque chose, qui peut être refusé ou accepté. En d'autres termes, une erreur doit être déclenchée avant qu'un événement de domaine soit distribué (sauf si cet événement de domaine est lié à la journalisation des erreurs, bien sûr).
Ludovic C

Réponses:

18

Puisque vous avez marqué votre question avec "CQRS", je suppose que vous voulez dire des événements dans un contexte "CQRS & Event Sourcing", comme cela est décrit ici . Dans ce tutoriel , la différence entre les événements et les commandes est bien expliquée:

  • les événements capturent les "choses qui peuvent arriver" élémentaires dans votre système, du point de vue du système.

  • les commandes sont définies par ce que l'utilisateur considère comme une opération, de son point de vue

Et bien que cela conduise souvent à quelques commandes et événements avec une correspondance 1: 1, ces différents points de vue peuvent conduire à des commandes qui déclenchent plus d'un événement, ou à des événements différents selon les paramètres de commande. Je peux même imaginer des cas où une commande ne déclenche pas du tout un événement, mais ce serait un cas très exceptionnel, pas très typique.

Par exemple, le didacticiel mentionne des événements

  • TabOpened
  • Boissons commandées
  • Alimentaire

et commandes

  • OpenTab
  • Passer la commande

Ici, la commande "OpenTab" conduira à un événement "TabOpened", mais la commande PlaceOrder conduira aux événements "DrinksOrdered", "FoodOrdered", ou les deux.

En fait, si vous concevez un nouveau système "à partir de zéro", vous pouvez essayer de le concevoir avec une correspondance 1: 1 entre les commandes et les événements et voir à quel point il évolue lorsque le système devient plus grand. Vous pouvez même essayer une approche hybride: une liste d'événements et de commandes avec une correspondance 1: 1, ainsi que quelques commandes combinées supplémentaires. Essayez simplement jusqu'où cela vous mène pour le système particulier que vous concevez.

Doc Brown
la source
10

Habituellement, une commande entraîne un événement. Mais dans certains cas, il peut également y en avoir plusieurs, cela dépend de votre implémentation.

Soit votre commande appelle d'autres commandes et chacune d'elles déclenche ses propres événements. Ou votre commande effectue elle-même différentes tâches et émet plusieurs événements. Par exemple:

RegisterUserCommand

  • User.create (email, mot de passe) → UserCreatedEvent
  • User.updateProfile (firstName, lastName, location) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
synthomat
la source
Que se passe-t-il si vous décidez plus tard d'en avoir UserWasAddedToCrm? Réécrire tout votre flux?
mcintyre321
@ mcintyre321 search événements chorégraphiés vs orchestrés
Benten
10

Une commande peut déclencher plusieurs événements. C'est simplement la conclusion logique d'un fait: Composite commandexiste.

Disons que vous avez deux commandes, chacune déclenchant un événement. Ensuite, vous créez une commande composite de ces deux. Du point de vue d'un utilisateur utilisant la commande composite, il semble que la commande ait déclenché deux événements.

Rien ne vous empêche donc d'avoir une seule commande provoquant plusieurs (voire aucun) événements.

Euphorique
la source