web-dev-qa-db-ja.com

DDDおよびCRQSを使用する場合、コマンドごとに正確に1つのイベントを使用する必要がありますか?

構成よりも規約を使用してdddアプリケーションを設計する方法を探しています。

集約「クライアント」にコマンド「FillProfile」が定義されているとしましょう。それはイベント「ProfileFilled」を論理的に発生させます。

コマンドがイベント以上のものを発生させる場合や、コマンドがいくつかのロジックに基づいて異なるイベントを発生させる場合はありますか?または、これは常に1対1の関係ですか(1つのコマンドは常に何も発生しないか、特定のタイプの単一のイベントを発生させます)。

これが事実である場合、コマンドが常に同じイベントを発生させることになるので、私はこれを求めています。その事実に基づいて、私の慣習システムを構築できます。 「RaiseEvent」が「EventRaised」になることは知っています...

18
Ludovic C

質問に "CQRS"のタグを付けたので、 "-CQRS&イベントソーシング"コンテキストのイベントを意味していると思います ここで説明 のようになります。 このチュートリアル では、イベントとコマンドの違いがよく説明されています:

  • イベントは、システムの観点から、システムでの基本的な「発生する可能性があること」をキャプチャします。

  • コマンドは、ユーザーの観点から、ユーザーが操作と見なすものによって定義されます

これにより、1対1の対応でいくつかのコマンドとイベントが発生することがよくありますが、これらの異なる観点から、複数のイベントを発生させるコマンドや、コマンドパラメーターに応じて異なるイベントが発生する可能性があります。コマンドがイベントをまったく発生させない場合も想像できますが、それは非常に例外的なケースであり、非常に典型的なケースではありません。

たとえば、チュートリアルではイベントについて言及しています

  • TabOpened
  • 注文したドリンク
  • FoodOrdered

およびコマンド

  • OpenTab
  • PlaceOrder

ここで、「OpenTab」コマンドは「TabOpened」イベントにつながりますが、PlaceOrderコマンドは「DrinksOrdered」、「FoodOrdered」、またはその両方のイベントにつながります。

実際、「ゼロから」新しいシステムを設計する場合は、コマンドとイベントを1対1で対応させてシステムを設計し、システムが大きくなったときにどれだけうまく拡張できるかを確認できます。ハイブリッドアプローチを試すこともできます。1対1対応のイベントとコマンドのリストと、いくつかの追加の結合コマンドを組み合わせて使用​​します。設計している特定のシステムについて、それがどれだけあなたを導くか試してみてください。

18
Doc Brown

通常、1つのコマンドで1つのイベントが発生します。ただし、場合によっては複数になることもあり、実装によって異なります。

コマンドが他のコマンドを呼び出し、それぞれが独自のイベントを発生させるかのいずれかです。または、コマンドが独自にさまざまなタスクを実行し、複数のイベントを発行します。例えば:

RegisterUserCommand

  • User.create(email、password)→UserCreatedEvent
  • User.updateProfile(firstName、lastName、location)→UserProfileUpdatedEvent
  • User.joinDefaultGroup()→UserJoinedGroupEvent
10
synthomat

1つのコマンドで複数のイベントを発生させることができます。それは単に1つの事実の論理的な結論です:Composite commandが存在します。

2つのコマンドがあり、それぞれがイベントを発生させるとします。次に、これら2つの複合コマンドを作成します。複合コマンドを使用するものから見ると、コマンドが2つのイベントを発生させたように見えます。

したがって、1つのコマンドで複数の(またはまったくない)イベントを発生させることを妨げるものは何もありません。

10
Euphoric