Krótki format pytania
Czy w ramach najlepszych praktyk DDD i OOP jest wstrzykiwanie usług do wywołań metod encji?
Przykład długiego formatu
Załóżmy, że mamy w DDD klasyczny przypadek Line-LineItems, w którym mamy Encję Domenową o nazwie Zamówienie, która działa również jako Korzeń Agregacji, a Encja składa się nie tylko z jej Obiektów Wartości, ale także kolekcji Elementu Zamówienia. Podmioty
Załóżmy, że chcemy płynnej składni w naszej aplikacji, abyśmy mogli zrobić coś takiego (zwracając uwagę na składnię w wierszu 2, w którym wywołujemy getLineItems
metodę):
$order = $orderService->getOrderByID($orderID);
foreach($order->getLineItems($orderService) as $lineItem) {
...
}
Nie chcemy wstrzykiwać żadnego rodzaju LineItemRepository do OrderEntity, ponieważ jest to naruszenie kilku zasad, o których mogę myśleć. Ale płynność składni jest czymś, czego naprawdę chcemy, ponieważ jest łatwa do odczytania i utrzymania, a także do testowania.
Rozważ następujący kod, odnotowując metodę getLineItems
w 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;
}
}
Czy jest to przyjęty sposób implementacji płynnej składni w Entities bez naruszenia podstawowych zasad DDD i OOP? Wydaje mi się, że jest w porządku, ponieważ ujawniamy tylko warstwę usługi, a nie warstwę infrastruktury (która jest zagnieżdżona w usłudze)