約30のビジネスイベントの制限付きコンテキストがあり、簡単にするために、ChangeUserEmailCommand
-> UserEmailChangedEvent
のような同じ数のコマンドがWeb UIから開始されたとします。コマンドの処理は、次の主な理由で失敗する可能性があります(もちろん、インフラストラクチャの障害に加えて)。
クライアントに最高のユーザーエクスペリエンスを提供し、問題点を表示することに興味があります。
失敗を知らせるためのベストプラクティスは何ですか?
ChangeUserEmailFailedEvent
のようなイベントをさらに30個作成しますか?そうでない場合、ペアになっているイベントを作成するための経験則は何ですか*FailedEvent
?bool Success {get;set;}
既存のイベントのプロパティ?エラーメッセージだけではなく、詳細なエラーを通知する必要がある場合、これはおそらく最良の方法ではありません。ConcurrencyFailedEvent
を作成しますか?この種の失敗をビジネス検証の失敗から分離するだけですか?コマンドは非同期に(ブローカー経由で)処理されます。読み取りストレージは書き込みストレージから分離されています。イベントソーシングはありません。
なぜこれが必要になるのかについては、次のことを考えることができます。
あなたは単一のタイプで逃げることができるように私には思えます
ErrorEvent
EventId
ErredEventId
ErrorType
Message
対処する必要のある一般的なエラーがあるだけの場合は、さらに進んで、UIのエラーイベントを削除します。
ユーザーが何かエラーが発生したかどうかを確認するために待機している場合は、ユーザーが呼び出した関数からエラーを返し、成功時にのみイベントを書き込むことができます。
したがって、EmailUpdated
EmailUpdateRequest
EmailUpdateFailed
などの代わりにEmailUpdated
完全にイベント駆動型にすることで、必要なタイプの数が爆発することがわかります。それらがすべてシッククライアントの内部にある場合、すべてを処理するためのコンパイル時間チェックがありますが、分散システムを介してそれらを渡す必要がある場合、それはとんでもないことになります。
ChangeUserEmailFailedEvent
がドメインのコアパーツであることを理解しました。したがって、常に保存する必要があります。重要なのは、ビジネス要件がどのように変化するかを予測できないため、念のためにドメインイベントを保存することをお勧めします。bool Processing {get;set;}
手段。ドメインの概念ではない場合は、省略してください。