DDDを使用してプロジェクトをリファクタリングしていますが、あまりにも多くのエンティティを独自の集約ルートにしないことが心配です。DDD:レポーティング用に集約ルート内のエンティティへのリンクを維持する
私は、ProductOption
のリストとProduct
のリストを持つStore
を持っています。 ProductOption
は、いくつかによって使用することができる。Product
。これらのエンティティは、Store
集計によく合うようです。
その後、私は一時的にそのOrderLine
Sを構築するためにProduct
を使用Order
を、持っている:今のところ、DDDは尊敬とルールと同様
class Order {
// ...
public function addOrderLine(Product $product, $quantity) {
$orderLine = new OrderLine($product, $quantity);
$this->orderLines->add($orderLine);
}
}
class OrderLine {
// ...
public function __construct(Product $product, $quantity) {
$this->productName = $product->getName();
$this->basePrice = $product->getPrice();
$this->quantity = $quantity;
}
}
が見えます。しかし、私は、集計のルールを破る可能性のある要件を追加したいと思います。Storeの所有者は、特定の製品を含む注文に関する統計をチェックする必要があることがあります。
これは、基本的に、OrderLineにProductへの参照を保持する必要があることを意味しますが、は決してとなります。この情報は、データベースに問い合わせる際にのみ、レポート目的で使用します。したがって、このため内部基準の店舗集約内部の何かを「壊す」することはできない。
class OrderLine {
// ...
public function __construct(Product $product, $quantity) {
$this->productName = $product->getName();
$this->basePrice = $product->getPrice();
$this->quantity = $quantity;
// store this information, but don't use it in any method
$this->product = $product;
}
}
は、この単純な要件は、製品が集約ルートとなっていることを指示していますか?これは、ProductOptionが集合ルートになるまでカスケードします。これは、Productに参照があるため、ストア外で意味を持たない2つの集計が得られ、リポジトリは必要ありません。私には奇妙に見えます。
コメントは大歓迎です!
ありがとう、それは合理的なアプローチと聞こえます。 SKUはありません。自動生成された 'productId'だけです。私がこのアプローチに後悔しているのは、DB内で外部キーを使用する利点を失うことです(私が行った場合、製品を削除すると失敗する)。あなたはこの特定の点について助言をしていますか? – Benjamin
私の最後の編集を参照してください。 – Dmitry