2016-09-10 4 views
3

CQRSでは、DBコールを必要とするコマンドを検証する最良の方法は何ですか? たとえば、Orderの集計では、コマンドの有効性が確認されています(CommitOrder)。十分な在庫がない限り、このコマンドを受け入れたくありません。 この場合、注文アイテムの在庫があるかどうかをコマンドハンドラで確認する方法はありますか?書き込み側から読み出し側に問い合わせることはできますか?DBコールを必要とするCQRSコマンド検証

注:私は、集約ルールの検証を実行するために、読み取りモデルを照会する必要がある場合は、それを行うための通常の方法は、ドメインサービス経由で実装

+0

コマンドはクエリを実行できますが、クエリは実行できません。 – CSharper

答えて

7

ためアッカを使用しています - あなたはサービスに渡しますクエリーのコントラクトを指定するインターフェース。そのコントラクトのインプリメンテーションはクエリーを実行します。

しかし、クエリを実行したときの回答が古いことを認識しておく必要があります。別の集約に格納されたデータを「最新のもの」とみなすことはできません。

また、要件を再度確認する必要があります。多くのドメインでは、在庫が現在利用できない場合でも注文を受け入れることが望まれます。結局のところ、注文はビジネス価値を付加する機会です。あなたは関係のない懸念に対してそれを拒否したくありません。これは、ビジネスが「在庫切れ」の例外を緩和する方法をすでに理解している場合に特に当てはまります。

他の集計のデータは失効していることを覚えておいてください。システムの別の部分が在庫レベルを更新しているため、注文を受け入れることができます。

ストックが利用できないときに注文をコミットする要件を緩和できず、失効したクエリデータを使用したときのエラー率が許容できないほど高い場合は、現在の在庫レベルがオーダーコミットと同じ整合性境界内にあります。

+0

回答ありがとうございます。はい、私はあなたに実際のビジネス要件と古いデータについても同意します。私の問題は、最終的にあなたが書き込みからの読み込みを問うというこの問題にぶつかる設計の問題です。だから、私は依存関係の絡み合いで私を終わらせる方向に動くことを恐れていた。書き込み側と読み取り側の間を調整する独立したサービスにコマンド検証をプッシュする方法はありますか?もしそうなら、佐賀を使用することができますか、私は別のサービスを作成し、佐賀のワークフローのみを維持する必要がありますか? – Mutaz

関連する問題