6

イベント ソーシングを使用して境界付けられたコンテキストを実装していますが、問題が発生しました。サッカーの試合をモデル化していて、個々の得点 (誰が得点したかなど) と全体の得点の両方に関心があるとします。したがって、Match 集計ルートがある場合、理想的には、GoalScored および ScoreChanged と呼ばれるイベントを発生させたいと考えています。このようにドメインから明示的に記述されたスコアが必要な理由は、多くの異なるリスナーと、おそらく他の境界付けられたコンテキストがすべて同じことを計算することを望まないからです。

これは単純に思えますが、Match オブジェクトには新しいゴールを追加する Goal() メソッドがあります。イベント ソーシングの精神では、これは Match 状態を直接変更するのではなく、Match 内で処理される GoalScored イベントを発生させ、その後状態を変更します (イベントは denormalizer にプッシュされます)。ScoreChanged を発生させるという点では、GoalScored イベントが処理されるまでスコアは実際には変化していないので、そのイベント (ScoreChanged) に応じて別のイベントを発生させて、イベントを効果的に連鎖させますか? 私はそうは思いません。集合ルートがイベント ストアからリロードされると、最初は、各 GoalScored に応答して、毎回多くの余分なイベントが作成されます。

また、GoalScored を発生させるコマンド ハンドラーでスコアがどうなるかを考えることも考えました。次に、コマンド ハンドラーで両方のイベントを発生させることができます。私は本当にそれをしたくないのですが、それは「正しく」ないようです。サッカーのスコア計算は簡単ですが、他のゲーム (クリケットなど) ではさらに多くの作業が必要になります。

ゴールとスコアの両方を GoalScored イベントに入れることもできますが、これは十分公平ですが、やはり正しくないようです。スコアは、GoalScored イベント自体とは何の関係もありません。

イベント ソーシングについて議論する際に使用されるすべての例は、e コマースの顧客/注文ドメインを使用しているように見えますが、これと同様のケースは見たことがありません。

このような状況に対処した経験のある人はいますか?

ありがとう

4

3 に答える 3

13

他のモデリングと同様に、クリーンなドメイン イベントを選択すると、ドメインにミラーリングされた概念が得られるはずです。「スコアは、GoalScored イベント自体とは何の関係もない」とあなたは言います。しかし、そうです。サッカーでは、スコアが変わる唯一の方法は、ゴールを決めた場合です。ただし、オフサイド コールやその他のペナルティにより、ゴールを取り戻すことはできます。これをモデル化するかどうかは明確ではありません。

ドメイン メソッドが一度に複数のイベントを発行するのは一般的です。優れたフレームワークは、それらをまとめて、たとえば単一のコミットと見なすことを容易にします。GoalScored イベントと ScoreChanged イベントの両方を発行しないのはなぜですか?

このドメインにコマンドがあるかどうかを検討することもできます。サッカーの試合自体が記録システムです。試合から生まれる出来事は、すでに歴史の記録です。イベントのストリームをさらに多くのイベントのストリームに処理するシステムを作成しているだけなのでしょうか?

于 2013-01-15T16:05:13.823 に答える
4

イベント ソーシングについて考えるときによく役立つことの 1 つは、時制に注意することです。StartMatch と言いますが、イベントの意味では、実際には MatchStarted イベントです。

ScoreChanged に関しては、Match 以外でこのイベントを使用していますか? そうでない場合は、Score のみがパブリックにアクセスできるようにする必要があり、GoalScored イベントはこれを変更するだけです。これはマイナーな方法で CQRS を保持します (スコアを取得する方法は、変更方法に依存しません)。その後、Score は状態を内部的に保持するか、すべての GoalScored イベントを再生して、呼び出されるたびに数値を取得できます。適切に設計されたイベント ソース ソリューションの「感触」は、常にイベントから任意の状態を再生成できます。

ここで、ScoreChanged がシステムの他の部分 (プレーヤーのランキングなど) にアラートを出す必要がある場合は、イベントを別のルートにマルチキャストするか、デザインのリファクタリングが必要になる場合があります。この場合、プレーヤーをリアルタイムで更新しますか、それとも試合が完了した後にのみ更新しますか?

于 2014-06-13T18:44:28.390 に答える