3

私はEventSourcingを使用したDDDプロジェクトを持っています。そして、現在のところ、多くの集合体を持つ多くの集合ルートがあります。さらに、一部のエンティティには他のエンティティのコレクションがあります。EventSourcingとDDDエンティティイベント

問題:監査の目的でEventSourcingイベントログを読み込んでいます。

質問:エンティティが更新/作成/削除されたときにEventStoreのイベントを保存する最良の方法は、これらのことを念頭に置いています。これらは読みやすいものでなければならず、バージョンではなく、おそらくドメインイベントがクロスドメイン通信に使用されることになります。

  1. は私の中にRootChangedEventなどのエンティティのすべてのコレクションと完全ルートをストリーミングするルートに保存すべきか?

  2. 私は2つのイベントEntityChangedEvent/EntityCreatedEvent/EntityRemovedEvent

  3. としてルートストリームで削除更新されたエンティティー/作成されたが、/ Iは、ルート・ストリームに保存すべきのみ保存すべき - ルートの1 - RootChangedEvent EntityCreatedEventのみidがEntityRemovedEventがあればあればそのようなものがEntityChangedEventまたはエンティティ全体で変更した場合にのみ、単一のプロパティを持つことになりますエンティティのための唯一のバージョンプロパティ+秒と(どのように処理するかの作成したエンティティのエンティティ/更新/削除?)

ここは例です私のプロジェクトでは:

ルートパイプライン。

public class Pipeline : AggregateRoot<IPipelineState> 

エンティティの集合 - public IList<Status> Statusesを持っています。

各ステータスには、エンティティの集合 - public IList<Logic> Logicsがあります。

すべてのコレクションには多くのエンティティを格納できます。そして今、私はPipelineCreatedEvent、PipelineChangedEvent(Pipelineが変更されたときだけでなく、ステータスやロジックを追加、更新、削除するときだけでなく)やPipelineRemovedEventのようなイベントを発生させます。

+0

イベントがCRUDに関するものであれば、悪い匂いです。 Event Sourcingを使用すると、事象がエンティティ特有のものではなくビジネス特有のものである場合、後でドメインモデルを変更する柔軟性が得られます。 –

答えて

3

競合状態を避けるために、任意の集計のために、イベントの単一のストリームがあるはずです。集計は、トランザクション境界です。あなたのケースでは

、ないエンティティの面ではなく、ビジネスの言葉であなたのシステムに何が起こったかを策定しようとは:

  1. OrderCreated(注文ID = 123)
  2. OrderItemAdded(注文ID = 123、「製品1 「)
  3. OrderItemAdded(注文ID = 123、 'product2')
  4. OrderItemRemoved(注文ID = 123、 '製品1')
  5. OrderPaid(注文ID = 123)
  6. OrderArchived(orderId = 123)

これらのイベントは何が起こったのですか?そのaggregateId - ご注文でオーダーしては、あなたの集約ルート、および123です。これはコマンドハンドラによって必要とされない限り、あなたも、そこのOrderItemsを必要としないかもしれません(たとえば、あなたは既に削除項目についてOrderItemRemovedイベントを放出する必要はありません)。

AggregateRoot 123のイベントストリームは1つで、PayOrderコマンドを処理している間は、誰もaddとOrderItemを実行できません。

イベントのビジネス特有性が高いほど、あとでドメイン集約や読み取りモデルを使用できるようになります。あなたのイベントは不変であり、永遠にそこに存在することを覚えておいてください!

OrderEntityChangedEventは(新しいステータスは=有料)どこかで受注集計のルートがある以外 OrderPaidイベントが何を負いませんあなたのエンティティの特定の構造を意味します。

+0

私はあなたの答えを理解しているか分からない。 –

+0

イベントストリームにエンティティを保存しないでください。あなたはイベントを保存する必要があります - あなたのシステムに何が起こったのですか?イベントからの書き込み側でリストアしたDDD集約には、受信するコマンドを検証するための最小状態が含まれている必要があります。私はあなたがそれを行うためにエンティティの3つのレベルが必要になると想像することはできません。どんなレベルの深いreadmodelでも構築できますが、集約は書き込み側にあります。 例があなたのユースケースを理解するのに役立つかもしれません。 –

+0

上記の質問の説明に例を追加しました。 –