Я занимаюсь рефакторингом проекта с использованием DDD, но меня беспокоит, что слишком много сущностей не станут их собственными агрегатными корнями.
У меня есть Store
, в котором есть список ProductOption
и список Product
. ProductOption
может использоваться несколькими Product
. Эти сущности, кажется, очень хорошо вписываются в агрегат Store
.
Затем у меня есть Order
, который временно использует Product
для создания своих 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, но это никогда не будет использоваться каким-либо методом внутри сущности. Мы будем использовать эту информацию только в целях отчетности при запросе базы данных; таким образом, было бы невозможно "сломать" что-либо внутри агрегата 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;
}
}
Означает ли это простое требование, что Product становится совокупным корнем? Это также приведет к тому, что ProductOption станет агрегированным корнем, поскольку у Product есть ссылка на него, что приведет к двум агрегатам, которые не имеют значения вне Store и не будут нуждаться в каком-либо репозитории; мне кажется странным.
Любые комментарии приветствуются!