DDD: mantenere un collegamento a un'entità all'interno di una radice aggregata, solo per la segnalazione
Domanda
Sto refactoring di un progetto usando DDD, ma sono preoccupato di non rendere troppe entità la propria radice aggregata.
Ho un Store
, che ha un elenco di ProductOption
s e un elenco di Product
S. UN ProductOption
può essere usato da diversi Product
S. Queste entità sembrano adattarsi al Store
aggrega abbastanza bene.
Allora ho un Order
, che usa transitoriamente a Product
per costruire il suo OrderLine
S:
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;
}
}
Per ora sembra, le regole DDD sono rispettate. Ma vorrei aggiungere un requisito, che potrebbe infrangere le regole dell'aggregato: il proprietario del negozio a volte dovrà controllare le statistiche sugli ordini che includevano un determinato prodotto.
Ciò significa che fondamentalmente, dovremmo mantenere un riferimento al prodotto nella linea di ordine, ma questo lo farebbe mai essere utilizzato con qualsiasi metodo all'interno dell'entità. Utilizzeremmo queste informazioni solo a scopo di reporting, durante l'interrogazione del database; Quindi non sarebbe possibile "rompere" qualsiasi cosa all'interno dell'aggregato del negozio a causa di questo riferimento interno:
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;
}
}
Questo semplice requisito impone che il prodotto diventi una radice aggregata? Ciò sarebbe anche in cascata per il prodotto che diventa una radice aggregata, poiché il prodotto ha un riferimento ad esso, risultando così in due aggregati che non hanno alcun significato al di fuori di un negozio e non avranno bisogno di alcun repository; Mi sembra strano.
Qualsiasi commento è il benvenuto!
Nessuna soluzione corretta