はじめに
この質問は、Aggregate Root 以外の Aggregate 内のエンティティがイベント生成動作を行う DDD および Event Sourcing に関するものです。
例
以下は、私が説明する状況の例です。ここでは、Aggregate 内の他のエンティティ内にいくつかのロジックをカプセル化したいと確信しています。これには、実際の例とそれが良いモデルであるかどうかに関する不信の停止が含まれる場合があります。:)
DeliveryRun
車両が配達を実行するための移動である Aggregate Root (AR)をモデル化しようとしています。出発する前に、最新のDeliveryManifest
. それの「最新性」は、ARによって定義された一貫性の境界DeliveryManifest
内のエンティティであることを私に示唆しています。DeliveryRun
ここまでは大丈夫です。
これには Event Sourcing アプローチを使用しています。このアプローチは、Greg Youngによって教えられ、 Regalo ライブラリに実装されています。これは、AR ( DeliveryRun
) に動作がない場合、実際にはエンティティを持たなくてもSalesOrder
よいことを意味します (たとえば、 a は代わりに/SalesOrderLines
などのイベントを記録するため、エンティティを持たない場合があります)。ItemsAdded
ItemsRemoved
ただし、 の周りにはいくつかのロジックがありDeliveryManifest
ます。具体的には、マニフェストが最初に要求された後、品目が配送に追加されるときに、新しいバージョンのマニフェストを作成する必要があります。これは、利用可能な最新のマニフェストがなければ、ドライバーが出発しないようにすることができることを意味します。
オブジェクト内のロジックをカプセル化するDeliveryManifest
場合 (これはシリアル化および保存されません。イベント ソーシングを使用しており、AR ではありません)、どうすればイベントをキャプチャできますか?
検討中のオプション
イベントはエンティティによって生成されますが、
DeliveryManifest
エンティティ自体に対して保存されますか (イベント ストアからロードさDeliveryRun
れたときに、これらのイベントを に再生する方法を知る必要があります)。DeliveryManifest
(おそらくデータ構造を除いて)存在せず
DeliveryManifest
、すべてのロジック/イベントは によって直接実装されるべきDeliveryRun
ですか?DeliveryManifest
それは独自の AR でDeliveryRun
あり、現在のマニフェストの ID が通知されていることを確認する必要がありますか? これにより、マニフェスト オブジェクトが の一貫性の境界の外にあるため、マニフェストに関連するDeliveryRun
の変更をサブスクライブするためのイベント処理を構築して、DeliveryRun
それに応じて更新/無効化などを行う必要があります。Udi の DomainEvents パターンと同様に、イベントをキャプチャするための別のスタイルを実装します。これは、Regalo ライブラリを変更することを意味しますが、両方のパターンをかなり簡単にサポートできるようにすることができると思います。これにより、集約内のすべてのエンティティによって生成されたすべてのイベントをキャプチャできるため、AR に対して保存できます。ただし、ロード/再生の解決策を考える必要があります...