2011-09-01 3 views
5

私は、集約ルート「注文」を持っている、そしてそれは内部的にその「ステータス」フィールドを設定し、その上に多数の方法がいる: CQRSでは、aggrregateで許容されるメソッドのリストをUIにどのように伝えますか?

  • 保留
  • 場所を

    • を提出するには、ホールド
    • を脱ぎます
    • 確認
    • キャンセル
    • など

    使用可能なアクションは、注文の現在のステータス(例:既に保留中の場合は保留にすることはできません)。問題は、どのコマンドが利用可能かをUIに伝えるためのクエリを提供する必要があるため、そうでなければInvalidOperationExceptionを投げる操作を隠すことができるということです。

    どのようにDRY違反を最小限に抑えることができますか?

  • 答えて

    4

    最も簡単な解決策は、現在の状態を読み込み/クエリモデルへの利用可能な遷移と共に投影し、表示するデータとともに選択することです。

    例:(EventStoreに置かれている以外に)公開され、注文に関連付けられたDBテーブルに使用可能な遷移を非正規化OrderTransitionsEventHandlerによって処理OrderPlacedOnHoldEventPlaceOnHoldCommand結果。クライアントは利用可能なトランジションを選択し、それに応じて動作します(利用できないボタンやそのようなボタンは表示されません)。

    これはもちろんオプションの1つです。しかし、重複はまったくありません。 CQRSは複雑さを管理するのに役立ち、時にはDRYのわずかな違反が発生することもあります。

    +0

    +1 - 合意しました。これ以上追加する必要はありません - これはあなたがそれを行う方法はかなりです –

    +0

    ああ、それはちょうどセクシーです!ありがとう! –

    関連する問題