0

私はCQRSを読んでコンセプトが好きですが、「通常の」開発とは少し違うと思います. 実装方法の良い例が見つからないという「問題」を見つけました。そして、それが2つの異なる集約ルートから「同じデータ」にアクセスする方法です。私が理解した方法は、aggregateroot とその値を書き込みデータベースにシリアル化し、2 つの異なる aggregateroot から「同じデータ」を取得できないことです。

これが私の言いたいことの例です。

したがって、Web ショップで商品を販売する場合、その商品の ItemsInStock を減らします。そのため、Web ページで、在庫がいくつあるか、または顧客に配送する前に注文する必要があるかどうかを示すことができます。

したがって、RefillStockCommand(int number) のようなコマンドを送信できるため、製品は aggregateroot になります。私が持つもう1つのaggregaterootは、注文を顧客などに送信するSendCommand()を持つOrderです。よくわかります。

SendCommand() を実行すると、注文したすべての製品の ItemsInStock-state を減らしたいと思います。また、一部が 5 を下回った場合は、小売業者にこの製品をさらに注文したいと考えています。では、Orderaggregateroot に製品の aggregateroots をロードしても問題ありませんか? それができれば、製品のデータを取得し、SendCommand() で製品の ItemsInStock-state も変更しますが、別の aggregateroot 内の aggregateroot にアクセスしても問題ないように聞こえますが、そうでない場合はどうすれば変更できますか? 1 つのコマンドで 2 つの aggregatesroots を実行し、ビジネス検証のために別の aggregaterroot で 1 つの aggregateroots データを使用しますか?

敬具 マグナス・グラッド

4

1 に答える 1

0

簡単なフローは次のようになります。

Ordergin/Biling 境界コンテキストで:

注文を作成する CreateOrder コマンドがあります。その結果、OrderCreatedEvent が公開されます。

在庫/製品管理の限定コンテキストでは:

各製品に ItemsInStock を減らすように直接指示するか、各製品にそのためのコマンドを送信する OrderCreatedEvent をサブスクライブするイベント ハンドラーを用意します。

CreateOrder トランザクション境界内の製品の ItemsInStock を変更する際の問題は、何らかの理由で在庫品目の変更が失敗した場合 (たとえば、マイナスになった場合)、注文の作成も失敗することです。これはおそらくあなたが望むものではありません。

これは、CQRS よりもドメイン モデリングと DDD に関係しています。

于 2011-07-08T08:54:40.640 に答える