2017-09-06 1 views
0

Je suis la conception d'une application CQRS en utilisant DDD, et je me demande comment mettre en œuvre le scénario suivant:Comment utiliser les sagas dans une architecture CQRS utilisant DDD?

  • un agrégat Participant peut être référencé par plusieurs ParticipantEntry agrégats
  • un AddParticipantInfoCommand est émis sur le côté de commande, qui contient toutes les informations du Participant et un ParticipantEntry (semblable à un Order et un OrderLineItem)

Lorsque la logique devrait être mis en œuvre que ch Vérifie si le Participant existe déjà et s'il n'existe pas, crée le Participant?

  • Au cas où il se fait dans une saga qui vérifie d'abord le modèle de domaine pour l'existence du Participant, et si elle ne trouve pas, émet un AddParticipantCommand et après une commande AddParticipantEntry contenant le Participant ID?
  • Est-ce que cela devrait être fait entièrement par les agrégateroots dans le modèle de domaine lui-même?
+0

« un agrégat de participants peut être associé à plusieurs agrégats ParticipantEntry » - Que voulez-vous dire? –

+0

Comment sont-ils associés? Par ID? Que représente cette "association"? –

+0

Que se passe-t-il si un participant en double est ajouté pour une courte période de temps? Quel est l'impact sur l'entreprise? Il est acceptable qu'un humain réessaye ou annule la commande? –

Répondre

2

Vous n Pas nécessairement besoin de sagas pour faire face à cette situation. Jetez un oeil à mon blog pourquoi pas pour créer des racines globales, et ce qu'il faut faire à la place:

http://udidahan.com/2009/06/29/dont-create-aggregate-roots/

+0

Donc, en effet, c'est le modèle de domaine lui-même qui devrait créer l'entité dépendante, pas le gestionnaire de commandes (ou Service Layer comme vous l'avez indiqué dans votre article de blog). Merci de m'indiquer dans la bonne direction! –

1

Lorsque la logique mise en œuvre qui vérifie si le participant doit existe déjà et si elle n'existe pas, crée le participant? Dans la plupart des cas

, ce comportement doit être sous le contrôle de l'ensemble des participants lui-même.

Les processus sont utiles lorsque vous devez coordonner des modifications sur plusieurs limites de transaction. Cependant, deux modifications au même agrégat peuvent être gérées dans la même transaction.

Vous pouvez mettre en œuvre cela comme deux transactions distinctes opérant sur le même agrégat, avec coordination; mais la complexité supplémentaire d'un processus n'offre aucun gain. Il est beaucoup plus simple d'envoyer la commande unique à l'agrégat, et de lui permettre de décider quelles actions prendre pour maintenir l'invariant correct.

Sagas, en particulier, sont un modèle pour revenir sur plusieurs transactions. Le How the Saga Pattern manages failures with AWS Lambda and Step Functions de Yan Cui inclut une bonne illustration d'une saga de réservation de voyage.

(Note:.. Il y a beaucoup de confusion à propos de la définition de « saga », la communauté NServiceBus a tendance à comprendre le terme d'une manière légèrement différente de celle décrite à l'origine par Clarifying the Saga Pattern enquêtes de Garia-Molina and Salem kellabyte la confusion)