質問
CQRS のおかげで思考モードになりました。CQRS のアイデアを使って新しいプロジェクトを始めようとしています。私が好きな主なものは、
1) クエリとコマンドの分離。ドメインクエリに問題がありました。
2) 監査にイベント ストレージを使用する - 少なくとも今は、再生には使用しません。
クエリ側については得意ですが、ドメイン イベントについてはまだいくつか質問があります。
コマンドの結果、複数の集約ルートが更新される場合(例:Order と OrderDetail) それらを UnitofWork (トランザクション) の下にスコープします。現在、各ドメインは、その状態に変更が生じたときにイベントを公開する責任を負います。
コマンドが 3 つの orderDetail レコードを変更するとします。各 OrderDetail は 2 つのイベントを発行します。最終的には 6 つのイベントができました。
a) ドメイン オブジェクトに変更を加えたらすぐにイベントを公開する場合 (トランザクションはコミットしない)、公開された (サブスクライバーによって消費された可能性がある) イベントを元に戻すにはどうすればよいですか?
- 私が考えることができるのは、公開するイベントを「同じ作業単位のスコープの下で」リストに保持し、トランザクションのコミットが呼び出されたら、それを保存して公開することです。これは人がやりそうなことだと思いますか?
b) OrderDetail の変更により、Order Aggregate Root でも何らかの変更を行う必要がある場合は、
i) OrderDetail Aggregate によって発行されたイベントを処理することによって、これらの変更を基礎にする必要がありますか?たとえば。2 つの注文詳細が削除されたとします。これにより、注文ステータスが「優先」から「非優先」になります。ii) イベントエラーが発生し、注文状態が更新されない場合はどうなりますか - 注文が引き続き優先される場合は、2 日以内に発送されます。
別の質問を追加する
c) 「ドメイン イベントはすべてのアプリケーション状態変更のソース」ですか、それとも「すべてのアプリケーション状態変更の結果」ですか。
よろしくお願いします、
ザ・マール
解決
A)あなたは、 に起こっている、それ故に彼らはすべての緊張のパスで命名された理由(例えばOrderClearedEvent)というイベント表すときに何かをするイベントを公開するべきではありません。また、あなたは「元に戻す」イベントに持っている場合には、あなたが是正措置を取るべきである、つまり、あなたがイベントを消去いけない、あなたは元に戻す
にしたいイベントの影響を補正し、新たなイベントをトリガしなければなりませんb)は、あなたが何かというあなたのエンティティとコマンドをモデル化する方法の詳細な問題のようです。私はOrderDetailはAggregateRootだろう理由を考えるカントが、私は自分のドメインを知らない...
コマンドは、少なくとも一つのイベントをもたらすであろうc)が公開されている
希望これは役立ちます:)としてRinatもcqrsinfo.comを見て、github.com/MarkNijhof/Fohjinとgithub.com/gregoryyoung/からのサンプルコードを持って、Googleのグループは、質問をするための最良の場所である、と述べましたMR