DDD を使用してプロジェクトをリファクタリングしていますが、あまりにも多くのエンティティを独自の集約ルートにしないことが心配です。
Store
のリストとProductOption
のリストを持つがありProduct
ます。AProductOption
は複数の s で使用できますProduct
。Store
これらのエンティティは、集計に非常によく適合しているようです。
次にOrder
、一時的に a を使用してそのsProduct
を構築する があります。OrderLine
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;
}
}
今のところ、DDD ルールは尊重されているようです。しかし、集計のルールに違反する可能性がある要件を追加したいと思います。ストアの所有者は、特定の製品を含む注文に関する統計を確認する必要がある場合があります。
つまり、基本的に、OrderLine で Product への参照を保持する必要がありますが、これはエンティティ内のメソッドで使用されることはありません。この情報は、データベースにクエリを実行する際のレポート目的でのみ使用されます。したがって、この内部参照のために Store 集約内の何かを「壊す」ことはできません。
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 つの集約になります。私には奇妙に見えます。
どんなコメントでも大歓迎です!