2011-12-07 9 views
4

私の質問はthis oneに関連しています。関連する質問と回答はなぜ分離したいのかを示していますが、私はその意図の理解が正しいことを確認したかったのです。私が見たすべての例では、コマンドの目的は、それを拒否し、メモリ内のオブジェクトを更新し、イベントがデータベースを更新するということです。今私はここで大いに簡素化していることを知っていますが、コマンドがメモリを更新し、イベントがDBを更新することを意味するのは間違いありませんか?そうでなければ、誰かが私のために明確にしてください。CQRSでのコマンドとイベントの意図

私はこれらのパターンを習得しようとしています。これはこれまで私がそれを掴んでいる方法であり、正しいことを確認したいのです。前もって感謝します。

答えて

7

ご理解の方が正しいです。

コマンドは、ドメインモデルに対して発行され、特定の動作を要求します。ドメインモデルは、実行が許可されているかどうかをチェックし、それに応じて動作します。 コマンドは、実行すべき特定のユースケースとして見ることができます。一方、

イベントは、単に何かがすでに起こったことを発表(あなたは過去を変えることができないので、彼らが拒否することはできません。)

これらのイベントのアプリケーション(だけでなく、他に基づいて、統合シナリオのアプリケーション)は、それに応じて反応することができます。たとえば、読み込まれたモデルデータベースを更新します。 イベントソーシングパターンが適用される場合

具体的には、その後、イベントは何を保存し、必要なときに、あなたのドメインモデルを再水和するために再生されています。

4

まず、私はあなたがそれを単純化し過ぎているとは思わない。それは単純な概念です。

コマンドは、アプリケーションに何かを指示します。

イベントは、あなたが何かしたことを世界に知らせるものです。

あなたのアプリケーションが(ビジネスルールまたはその他の理由により)実行するように指示されたことを実行できない場合は、実行しません。そして、何も発表しません。それが何かをしたら、それはイベントを通してそれを発表する。

イベントに登録されている人が気になる場合は、そのイベントのデータでアプリケーションを更新できます。

実際には、これは一般に、読んだモデルがイベントにサブスクライブし、それに応じて更新されることを意味します。

ユーザーを作成します。ユーザーに関する情報を含むUser_CreateCommandを発行します。コマンドハンドラは新しいオブジェクトを作成し、そのオブジェクトはユーザであり、リポジトリに保存します。ユーザーを作成すると、読み込みモデルによって処理されるUser_CreatedEventが発生し、読み込みモデルが更新されます。他のリッスンしているシステムでも、自分自身を更新できます。

少し勉強する部分は、あなたのユーザーをリポジトリに保存すると、思ったように実際にユーザーオブジェクトを保存していないという事実です。実際には、ユーザーに関するすべてのデータを含むUser_CreatedEventを保存しています。

後で、あなたのユーザオブジェクトが必要なときは、_repo.GetById(1)のようなものを呼び出します。

これは、そのユーザーを扱うすべてのイベントを再生し、ユーザーオブジェクトを作成します。

希望するもの:

関連する問題