4

次の例: https://msdn.microsoft.com/en-us/library/jj591569.aspx (図 3)

http アプリケーションにどのように適合しますか?

ユーザーは、PlaceOrderCommand を送信する PlaceOrderController に対して http 要求を実行する必要がありますが、注文処理マネージャーはユーザーに「9. 注文が確認されました」とどのように応答するのでしょうか? この情報をユーザーに返すために、コントローラーはどのようにそれを認識していますか?

ありがとう

4

3 に答える 3

4

「注文確認済み」にすぐに返信しないだけです。Amazon やその他のショッピング サイトがどのようにそれを行っているかを見てみましょう。注文を送信すると、「注文受理の確認 (HTTP Code 202 Accepted など)」を受け取るだけです。実際の注文が注文プロセス マネージャーによって処理されると、「注文」メッセージが表示されます。別のメッセージ/チャネル (電子メールなど) で確認済み" 通知がユーザーに送信されます。

于 2015-09-16T07:02:45.223 に答える
2

@Hippoom はあなたを正しい方向へと導きます。

CQRS Journey (何を読んでいるか) は次のように述べています。

チームは後に、システムが注文を保存するかどうかを確認するためのこのメカニズムを、Post-Redirect-Get パターンの実装に置き換えました。次のコード サンプルは、StartRegistration アクション メソッドの新しいバージョンを示しています。Post-Redirect-Get パターンの詳細については、Wikipediaの記事Post/Redirect/Getを参照してください。

[HttpPost]
public ActionResult StartRegistration(string conferenceCode,
OrderViewModel contentModel)
{
...
this.commandBus.Send(command);
return RedirectToAction(
"SpecifyRegistrantDetails",
new { conferenceCode = conferenceCode, orderId = command.Id });
}

アクション メソッドは、コマンドを送信した直後に SpecifyRegistrantDetails ビューにリダイレクトするようになりました。次のコード サンプルは、ビューを返す前に、SpecifyRegistrantDetails アクションがリポジトリ内の注文をポーリングする方法を示しています。

[HttpGet]
public ActionResult SpecifyRegistrantDetails(string conferenceCode, Guid orderId)
{
var draftOrder = this.WaitUntilUpdated(orderId);
...
}

この 2 番目のアプローチの利点は、StartRegistration ポスト アクションの代わりに Post-Redirect-Get パターンを使用することであり、ブラウザーの進むおよび戻るナビゲーション ボタンでより適切に機能することです。

ここでは、ミリ秒または最悪の場合数秒の結果整合性について話しています。したがって、PRG パターンは完璧に適合します。

とにかく、あちこちで、結果整合性 UI に関する記事を読むことができます。

コメントの編集を投稿:

彼女のe Udi Dahan は次のように述べています。

どのような場合に CQRS を避けるべきですか?

答えはほとんどの場合です。

CQRS を正しく実行していることを示す最も強力な指標は次のとおりです。集計ルートはサガです

したがって、あなたの問題は、HTTP アプリケーションで CQRS がどのように機能するかを発見することではないと思います。あなたの問題は、あなたが疑問に思っているプロセスとユースケースでは、CQRSを避ける​​べきだということです.

于 2015-09-16T10:58:49.380 に答える
0

Web/REST API はドメイン モデルから独立していますが、ユース ケースとユーザー エージェントのニーズに基づいてマッピングされます。1 つの方法は、「ジョブ」を送信してから、ジョブの進行状況をポーリングすることです。考慮すべき多くのトレードオフがあります。たとえば、インフラストラクチャによっては、通知を送信するのがおそらく最善の方法です。REST/HTTP が必要な場合は、これを試すことができます。

ユーザーエージェント:

POST /jobs/registrations
..content..

元のサーバー:

HTTP/1.1 303 See Other
Location /jobs/registration/<some-job-id>

ユーザーエージェント:

GET /jobs/registration/<some-job-id>
..content with job status..
于 2016-04-12T01:37:49.710 に答える