2017-09-06 10 views
0

私はDDDを使用してCQRSアプリケーションを設計していますし、次のシナリオを実装する方法を疑問に思って:DDDを使用してCQRSアーキテクチャでsagasを使用するにはどうすればよいですか?

  • Participant集計がParticipantEntry集計
  • AddParticipantInfoCommandは、コマンド側に発行された複数によって参照することができ、ロジックはそのCHを実装する必要があります(Orderと1 OrderLineItemに類似)Participantと1 ParticipantEntry

のすべての情報が含まれています参加者が既に存在するかどうかを確認し、参加者が存在しない場合は、参加者を作成しますか?

  • それが見つからない場合は、それが最初Participantの存在をドメインモデルをチェック佐賀で行われなければならず、AddParticipantCommand、その後Participant IDを含むAddParticipantEntryコマンドを発行?
  • これはドメインモデル自体のaggregaterootによって完全に行われるべきですか?
+0

「参加者の集合体は、複数のParticipantEntry凝集体に関連付けることができます」 - あなたは何を意味するのですか? –

+0

どのように関連付けられていますか? IDで?この「関連」を表現するものは何ですか? –

+0

重複した参加者が「短期間」追加された場合はどうなりますか?ビジネスにどのような影響がありますか?人間がコマンドを再試行またはキャンセルすることは許容されるか? –

答えて

2

あなたドンこのような状況に対処するためには必然的にサガが必要です。集計のルーツを作成するために、なぜないの私のブログの記事を見て、代わりに何をすべきか:

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

+0

実際、それは、コマンドハンドラ(またはあなたのブログ記事に記載されているサービスレイヤ)ではなく、依存エンティティを作成するドメインモデル自体です。正しい方向に私を指してくれてありがとう! –

1

参加者がすでに存在するかどうかをチェックし、存在しない場合は参加者を作成するロジックを実装する必要がありますか?

ほとんどの場合、この動作は、参加者集約自体の制御下にある必要があります。

プロセスは、複数のトランザクション境界で変更を調整する必要がある場合に便利です。ただし、同じ集約に対する2つの変更は、同じトランザクション内で管理できます。

は、これを、同じ集約で動作する2つの異なるトランザクションとして実装します。プロセスの余分な複雑さは何の利益ももたらさない。 1つのコマンドを集合体に送る方がずっと簡単で、正しい不変量を維持するために取るべきアクションを決定することができます。

Sagasは、特に、複数のトランザクションを元に戻すためのパターンです。 Yan CuiのHow the Saga Pattern manages failures with AWS Lambda and Step Functionsには、旅行予約サガの良いイラストが含まれています。

(注:「サガ」の定義についてはかなりの混乱があり、NServiceBusコミュニティが長期にもともとGaria-Molina and Salem kellabyteのClarifying the Saga Pattern調査による混乱を説明したよりもわずかに異なる方法を理解する傾向がある)

関連する問題