9

私は最近、開始しようとしているグリーン フィールド プロジェクトの CQRS と DDD の調査を開始しました。Udi Dahan、Greg Young、Mark Nijhof などから多くの資料を学びました。これらは非常に役に立ち、概念をよく理解していると思います。しかし、これらを自分のドメインにどのように適用できるかについては、まだいくつかの疑問があります。

私のシステムは基本的に複雑なルール エンジンであり、特定の製品の最終価格はルールによって決定されます。製品の定義とルールは、管理者によってシステムに入力されます。ルールは、 「購入の目的」(再販、貸し出し)などの事前定義されたセットの値、またはAgeなどの自由形式の値を持つことができる事前定義されたプロパティのセットを使用して、管理者によって設計されます。

各製品には基本価格があり、ルールが適用される場合、基本的に基本価格に追加または削除されます。

非常に単純なサンプル ルールは次のようになります。

製品 X の場合、IF (購入目的 = 転売および年齢 > 25) の場合、基本価格に 25 ドルを追加します。

したがって、システムを使用するユーザーには 2 種類あります。管理者は、製品、ルール、および基本価格を定義します。what-if UI を介して入力したシナリオに基づいて価格を照会する他のユーザー。

ここでの私の混乱は次のとおりです。シナリオを実行してもドメインの状態はまったく変化しません。他の外部システム/人はシナリオ実行の結果に興味を持っていませんが、実行中のユーザー自身-価格の結果を返します特定のシナリオに適用可能なルールを実行した後の計算。たとえば、ユーザーが製品 Xを選択し、 (購入目的 = 再販および年齢 = 40)などの特定のシナリオの価格を照会する場合があります。. 繰り返しますが、この操作はドメインの状態をまったく変更しないので、クエリだと思います。しかし、最終的な価格を計算するためにシナリオ上で動作するルール エンジンがあり、実行されているドメイン ロジックとして分類できると思います。では、このロジックはどこに属しているのでしょうか。これは、読み取りモデルから離れて機能するクエリですか、それともドメイン モデルで実行する必要があるコマンドのシナリオを実行していますか? 繰り返しますが、ドメイン層はこれらのルールの場所のように感じますが、シナリオ実行の結果をユーザーに渡すにはどうすればよいでしょうか (このように考えるクエリのように感じます)。それとも、CQRS はこの特定の問題に対する適切なソリューションではないでしょうか?

4

2 に答える 2

4

私は自分のドメインでこの正確な問題を抱えていました(e-scheduling 4 health)。基本的にドメインモデル(書き込み側)でシステムを構成します。これは、ドメイン内のルール、製品、および基本価格を定義することです。ドメインから何が生まれますか?イベント、状態の変化、起こったことと、それが起こった理由。ここで私がしたことは、これらのイベントを別の境界付けられたコンテキストで消費することでした。私の場合は、医師、手術室、および高価な機器のスケジュールで空きスロットを見つける複雑な検索エンジンです。これは、製品、基本価格、およびルール関連のイベントを消費し、そのデータの上にあるルール エンジンがシナリオに対するユーザー リクエストをできるだけ効率的に処理できるような方法でそれらを保存する方法としても使用できます。可能。おそらくあなたの' 変更を保存するモデル (ドメイン) は、これらの what-if シナリオを照会するために最適化されたモデル (ルール エンジン) とは異なることがわかります。あなたのドメインには、おそらく「同じ商品を 2 回指定することはできません」または「このルールは決して一致しません (年齢 < 25 && 年齢 > 25)」などのルールがあります。ドメインは、有効な状態変更のみを許可することに関心があります。これは、ルール エンジンの問題ではありません。ドメインで定義されているルール エンジンの概念/クラスを再利用したくなるでしょう。その衝動に抵抗してください。それらが本当に同じ目的を果たしているかどうかを質問します。別の目的で 2 回モデル化することは、ダーティでも DRY 違反でもありません。

于 2011-01-15T12:58:36.507 に答える
0

CQRS は、アプリケーションのクエリ部分にドメイン ロジックがあってはならないことについて何も述べていません。可能で実際的な場合は、アプリケーションのすべての側面またはクエリに対して個別の非正規化クエリ ストアを使用しても問題ありませんが、もちろん必須ではありません。

要するに、答えを見つけるタスクがどれほど複雑であっても、クエリはクエリです。

于 2011-06-19T12:59:33.313 に答える