私は DDD の概念を学んでおり、理解を深めるために実際の例に取り組んでいます。
集約にはルート エンティティを介したエントリ ポイントが 1 つだけ必要であり、集約にはリポジトリが 1 つだけ必要であることを知っています (完全に間違っていると理解した場合は修正してください)。
ここで、特定の種類の消耗品があり、これらの消耗品が配送センターから送られてくるとします。特定のタイプの消耗品の発送は、その数量によって異なります。つまり、消費者の 1 人がタイプ A と B のクリティカル数量 10 を持っていて、それらのアイテムの数量が 10 を下回った場合、配送センターはタイプ A と B の消耗品を送ります。ここでは、送信者と消費者の両方が、送信されたパッケージがどこにあるか、またはそれが配達されたか、またはまったく送信されたかを追跡したいと考えています。
ここでは、エンティティとして次のものがあります。
- 消耗品
- 消耗品の種類
- 消耗品アクティビティ
- パッケージ
- パッケージアイテム
- 消費者
最初の 3 つのエンティティについて混乱しています。どのエンティティを集約ルートにする必要がありますか? ざっと見てみると、消耗品が有力な候補のように見えますが、一方で、すべての消耗品を気にしているわけではなく、その量だけに関心があります。タイプ A の 10 個の異なる消耗品を記録するのではなく、活動に応じて数量が変化するタイプ A の記録しかありません。この時点で、消耗品エンティティは冗長に見えますが、アクティビティを見るだけで数量を導き出すことができます。たとえば、ゼロから開始します。
- センタークリエイト「タイプA」 10
- センタークリエイト「タイプB」 20
- センター送信「タイプ A」 5 ConsumerId=25
- センター送信「タイプ B」 15 ConsumerId=25
- ConsumerId=25 「タイプ A」5 を受信
- ConsumerId=25 「タイプ B」15 を受信
- ConsumerId=25 「タイプ A」を消費 3
- ConsumerId=25 「タイプ B」を消費 1
- ConsumerId=25 「タイプ A」を消費 2
ここでは、中央に 5 つのタイプ A および B の消耗品があり、現時点では id 25 の消費者にはタイプ A および 14 のタイプ B の消耗品があることがわかります。
もちろん、これは効果的なアプローチではありませんが、より多くの活動が行われた後、消耗品の数量を導き出すのに時間がかかるため、消費者と流通センターの両方に対して、すべての消耗品タイプの静的な数量フィールドが必要です。現在の量を一度に。
私が混乱している理由を理解していただければ幸いです。消費可能なエンティティはルート エンティティのように見えますが、実際にはエンティティではない場合、ルート エンティティには適合しません。
この設計に関する改善点や、顧客製品注文注文ラインの悪夢に限定されない推奨事項をさらに読むことを提案できる人はいますか?
編集: Consumable および ConsumableType との関係は何ですか? ConsumableType で CRUD 操作を実行したい (ユーザーに新しいタイプを追加、変更、または削除させる) が、ルート エンティティが Consumable である場合はどうすればよいでしょうか。DDD でデータの整合性を維持するには、ルート エンティティ リポジトリ以外のリポジトリをロードしないでください。
編集 2: Product エンティティとその Category エンティティについて考えてください。製品はルート エンティティのようですが、製品はカテゴリなしでは存在できないことがわかっています。では、Category エンティティはルートですか? その場合、DDD の規則に従って、トラバースによってのみ製品にアクセスできます。しかし、私たちのコンテキストでは、製品が私たちの焦点です。次に、製品集計とカテゴリ集計の 2 つの集計があるとします。しかし今回は、このカテゴリを持つ製品を削除せずにカテゴリを削除する可能性があるため、データの整合性に違反しています。そのため、私は多くのことを混乱させており、適切な解決策を見つけることができませんでした。