11

ドメイン イベントを使用して読み取りモデルを構築するシステムのフローについて、少し混乱しています。特に、ユーザーがコマンドを完了したときにデータ (およびそのビュー) が変更されることを期待しているにもかかわらず、システム アーキテクチャ (イベントを発行するための非ブロック呼び出し) により、実際のデータベースは変更前に変更されない可能性があるという事実にどのように対処すればよいでしょうか。ページがリロードされますか?

イベントとサービス バスを使用して、システムの 1 つの設計を CQRS とより一致させたいと考えています。

私のフローが次のようになるとしましょう:

  1. ユーザーはビューのボタンをクリックして、アカウントから支払い方法を削除するタスクを実行します。

  2. コントローラーは PaymentMethodRemovalService を呼び出し、accountId と paymentMethodId を渡します。

  3. コントローラーは AccountRepository を使用してアカウントを取得し、account.RemovePaymentMethod(id) を呼び出します

  4. アカウントは操作が実行できることを検証し、イベント PaymentMethodRemovedMessage(accountId, paymentMethodId) を発行します

  5. イベント発行は非同期であるため、サービスから戻り、コントローラーからビューを返す必要がありますが、実際のデータはまだ更新されていません

  6. ハンドラー IHandle< PaymentMethodRemovedMessage > がイベントを受け取り、DB から実際の行を削除します。

それで、男は何をするのですか?

たとえば、支払い方法を表示していた div を削除するだけです。これは AJAX シナリオで機能する可能性がありますが、JavaScript 以外のクライアントをサポートするために Post-Redirect-Get を使用している場合はどうでしょう。次に、おそらく更新される前に、Get を起動し、Query 側からデータを読み取ります。

支払い方法を削除するリクエストが送信されたことを示す通知を表示するだけですか? (友好的ではないように見えますが、注文を送信するのには意味がありますが、住所の変更などには意味がありません)。

変更を分離された非同期イベントとして実装し、現在の変更を反映するユーザー データを表示する方法はありますか?

編集:私の質問はCQRS、DDD同期レポートデータベース に非常に似ています。そこに与えられた答えとここでほのめかされた答えには、少し臭いがあります-帯域外の更新を表示するためにUIを混乱させますいわば読み取りDBです。私はもう少しきれいなものを望んでいました。

4

2 に答える 2

8

リクエスト/レスポンス モデルに縛られている場合は、相関リクエスト/レスポンス パターンを採用できます。詳細については、NSB ダウンロードの Async Pages サンプルを確認してください。これは、ASP.NET 設定での要求/応答を示しています。それがあなたのものである場合は、そこにいくつかの ASP.NET MVC の例があります。

非同期処理を導入すると、データが古くなることを受け入れることになります。DB にクエリを実行した時点で、データはすでに古いものであると主張できます (ネットワーク レイテンシ、レンダリング時間など)。データはすでに古いため、何歳で十分であるかを尋ねる必要があります。

考慮すべきもう1つのことは、処理が少し順不同であることです。ステップ 3 は、コマンドをサーバーに送信する前に検証する必要があり、ステップ 3、4 は 6 の後に続きます。コマンドが有効な場合にのみデータベースを更新し、データベースが正常に更新された場合にのみイベントを公開する必要があります。

于 2010-10-06T23:36:58.350 に答える