を更新するために必要な詳細情報が含まれていません。CQRSイベントは、私が得ることはありませんCQRSについての一つのことがあります読んモデル
残念ながら、これは非常に一般的なシナリオです。
例:私はグループにユーザーを追加するので、私はaddUserToGroup(userIdを、のgroupId)コマンドを送信します。これが受信され、コマンドハンドラによって処理され、userAddedToGroupイベントが作成され、保存され、公開されます。
ここで、イベントハンドラはこのイベントと両方のIDを受け取ります。ここには、そのグループの名前を持つすべてのユーザーをリストするビューがあります。そのビューの読み取りモデルを更新するには、ユーザーID(グループID)とグループ名(グループIDは必要ありません)私たちはそのIDだけを持っています)。
質問は次のとおりです。このシナリオをどのように処理すればよいですか?
現在、4つのオプションは、私の心に来て、彼らの特定の欠点を持つすべて:
読み取りモデルがドメインを要求します。 =>禁止されていても、ドメインは行動しか持たないため、(公開されていない)状態である。
読み出しモデルは、リード・モデル内の別のテーブルからグループ名を読み出します。 =>動作しますが、一致するテーブルがない場合はどうなりますか?
イベントに必要なデータを追加します。 =>これは、以前のすべてのイベントも更新する必要があることを意味し、どのデータが1日必要なのか予見できません。
「通常の」イベント・ハンドラを使用してイベントを処理しないで、イベント・ストアを処理するバックグラウンドでETLプロセスを開始し、必要なデータを作成し、読み取ったモデルを書き込みます。 =>動作しますが、このような単純なシナリオでは、これはあまりにも多くのオーバーヘッドのようです。
したがって、このシナリオを正しく処理するにはどうすればよいですか。
さて、これまでのところ、私はそれを得ました;-) 私がまだ得られなかったものは:PurchaseOrderSubmittedイベント_today_にVATが含まれていないと仮定します。今、私が行っている将来のある時点に早送りします。 もちろん、VATを含む新しいイベント、基本的にV2.0を作成することはできますが、これは過去のすべてのオーダーを手伝ってくれませんか? どうすれば対処できますか? –
モデルの構造とイベントの構造を互いに独立して変更することができます。モデルが新しい情報(VATなど)で拡張されると、古いイベントのハンドラーはそのまま、または新しいプロパティーをデフォルト値に設定します。新しい列をデータベーステーブルに追加するときと同じように、次のようにします。新しい列は、すべての文字エントリに対してnullまたはデフォルトのいずれかに設定する必要があります。イベントが再生されたり、読み込みモデルの水和に使用されるたびに、新しいフィールドは必要なデフォルト値に設定されます。 –
さて、ありがとう、それは意味をなさない:-)! –