Kurzes Fragenformat
Gehört es zu den Best Practices von DDD und OOP, Dienste in Entitätsmethodenaufrufe einzufügen?
Langformat-Beispiel
Angenommen, wir haben den klassischen Order-LineItems-Fall in DDD, in dem wir eine Domänenentität namens Order haben, die auch als Aggregatstamm fungiert, und diese Entität besteht nicht nur aus ihren Wertobjekten, sondern auch aus einer Sammlung von Werbebuchungen Entitäten.
Angenommen, wir möchten eine fließende Syntax in unserer Anwendung, damit wir so etwas tun können (beachten Sie die Syntax in Zeile 2, in der wir die getLineItems
Methode aufrufen ):
$order = $orderService->getOrderByID($orderID);
foreach($order->getLineItems($orderService) as $lineItem) {
...
}
Wir möchten keine LineItemRepository in die OrderEntity einfügen, da dies eine Verletzung mehrerer Prinzipien darstellt, die mir einfallen. Aber die fließende Syntax ist etwas, das wir wirklich wollen, weil es einfach zu lesen und zu warten sowie zu testen ist.
Betrachten Sie den folgenden Code und beachten Sie die Methode getLineItems
in OrderEntity
:
interface IOrderService {
public function getOrderByID($orderID) : OrderEntity;
public function getLineItems(OrderEntity $orderEntity) : LineItemCollection;
}
class OrderService implements IOrderService {
private $orderRepository;
private $lineItemRepository;
public function __construct(IOrderRepository $orderRepository, ILineItemRepository $lineItemRepository) {
$this->orderRepository = $orderRepository;
$this->lineItemRepository = $lineItemRepository;
}
public function getOrderByID($orderID) : OrderEntity {
return $this->orderRepository->getByID($orderID);
}
public function getLineItems(OrderEntity $orderEntity) : LineItemCollection {
return $this->lineItemRepository->getLineItemsByOrderID($orderEntity->ID());
}
}
class OrderEntity {
private $ID;
private $lineItems;
public function getLineItems(IOrderServiceInternal $orderService) {
if(!is_null($this->lineItems)) {
$this->lineItems = $orderService->getLineItems($this);
}
return $this->lineItems;
}
}
Ist dies die akzeptierte Methode zur Implementierung einer fließenden Syntax in Entities, ohne die Kernprinzipien von DDD und OOP zu verletzen? Für mich scheint es in Ordnung zu sein, da wir nur die Service-Schicht verfügbar machen, nicht die Infrastruktur-Schicht (die im Service verschachtelt ist).