2016-04-22 5 views
0

つの質問 1)集計とどのように彼らはイベントソーシング - 集計モデリングモデリングする方法

効率的に取り出すことができるように/ストアイベントを開催するためにそれらの間の基準 2)の例として、この典型的なユースケースを取り、我々 OrderとLineItem(これは集合体で、Orderは集合体のルートです)とProduct集合体を持ちます。 LineItemはどのProductを知る必要があるので、2つのオプションがあります。1)LineItemはProduct集約を直接参照しています(これはベストプラクティスではないと思われます。 Order aggregate)2)LineItemにはProductIdしかありません。

2番目のオプションのように見えますが...ここではどう思いますか?

しかし、注文読取り/表示モデルを構築することに関するもう1つの問題が発生します。このオーダービューモデルでは、どのプロダクトがオーダーにあるかを知る必要があります(商品ID、タイプなど)。典型的な使用事例は報告であり、CommandHandlerはこのProductオブジェクトを使用して、特定の製品などが多すぎるかどうかなどのロジックを実行することもできます。そのためには、それらのデータが2つの別々の集合体1 +データベース往復が必要です。モデルを構築するためにイベントを使用しているので、擬似コードは以下のようになります 1)与えられた注文ID(guid、order aggregate id)に対して、すべてのイベントをロードします。 - 1番目のデータベースへのアクセス 2)Order集計を作成し、OrderでどのProductIdが参照されているかを確認します。 3)ProductIdsのリストについては、すべてのイベントをロードします。 - 2番目のデータベースへのアクセス

オブジェクトの実際の大きなグラフ(異なる集合体)を作成すると、データベースアクセスがもう少し遅くなる可能性があります。ここに?

おかげ

答えて

0

は、一例として、この典型的なユースケースを取る、我々は秩序とのLineItem(彼らは集約され、注文が集約ルートである)、および製品の集合体を持っています。

注文集計は、あなたがそれを記述した方法に合っています。 「製品集約」はより疑わしい。製品の変更が許可されているかどうか、または製品が変更されたことをモデルに伝えているかどうか、モデルに尋ねますか?

ご注文と最初に相談することなく製品が変更される場合は、でなく、に製品が含まれている必要があります。製品(別名ProductId)への参照は大丈夫です。

私たちはオブジェクト(たくさんの異なる集合体)のグラフを作成すると、データベースアクセスがもう少し増えます(それぞれが遅い)...ここであなたのアイデアは何ですか?

- 履歴に新しい予定を追加しない場合は、遅い作業を事前に行うことができます。非同期プロセスは、イベント・ストア内の書き込みをリッスンし、それらのイベントをバスにパブリッシュします。サブスクライバは、新しいイベントが発生したときに新しいバージョンのレポートを作成し、結果をキャッシュします。 (検索キーワード:

クライアントがレポートを要求すると、キャッシュから1つを取り出します。すべての作業が完了しているので、非常に迅速です。

コマンドハンドラの場合、その答えはより複雑です。ビジネスルールはドメインモデル内にあるはずなので、コマンドハンドラに(ドメインモデルとは対照的に)コマンドを検証しようとすると少し壊れてしまいます。

コマンドハンドラは、状態をどのように見ているかを知るために製品を読み込み、コマンドデータを使ってその情報を集約に渡すことができますが、それは良い考えです。クライアントがコマンドを実行する必要があります。また、Productデータを使用してOrderコマンドを完成させる必要があります。代わりに、コマンドに直接製品データを追加し、中間の人をスキップしてみてください。

CommandHandlerもなど、など、あまりにも多くの特定の製品があるかどうかなどのロジックを実行するために、この製品のオブジェクトを使用することができます

この例は少し曖昧ですが、推測を取る:あなたが考えています利用可能な在庫が注文を満たすには不十分な場合に注文が行われないようにするケース。

実際の在庫については、倉庫内の物理的な本の場合、それはおそらく間違ったアプローチです。まず、モデルそのものが間違っている。倉庫内の製品の量を知りたい場合は、製品ではなく倉庫を照会する必要があります。第二に、物理的な倉庫はあなたのモデルに制約されません。倉庫の集合体上でaddProductメソッドを呼び出すことによって、魔法のように製品が表示されることはありません。

第3に、おそらくドメインエキスパートが望んでいるものとよく一致しません。モデルは倉庫に十分な製品を持っていないと言う場合は、利害関係者が

  1. にシステムをしたいと思います順序を受け入れる
  2. どこか別の製品を購入する買い物客に伝える、または...新しい供給のためにサプライヤーに連絡してください。

ヒント:不明な点がある場合は、amazon.comの対応方法を慎重に検討してください。

関連する問題