Format pertanyaan pendek
Apakah dalam praktik terbaik DDD dan OOP untuk menyuntikkan layanan pada panggilan metode entitas?
Contoh format panjang
Katakanlah kita memiliki kasus Order-LineItems klasik di DDD, di mana kita memiliki Entitas Domain yang disebut Order, yang juga bertindak sebagai Root Agregat, dan Entitas itu terdiri tidak hanya dari Object Value-nya, tetapi juga koleksi Item Baris Entitas.
Misalkan kita ingin sintaks yang lancar dalam aplikasi kita, sehingga kita dapat melakukan sesuatu seperti ini (mencatat sintaks pada baris 2, di mana kita memanggil getLineItems
metode):
$order = $orderService->getOrderByID($orderID);
foreach($order->getLineItems($orderService) as $lineItem) {
...
}
Kami tidak ingin menyuntikkan segala macam LineItemRepository ke dalam OrderEntity, karena itu merupakan pelanggaran terhadap beberapa prinsip yang dapat saya pikirkan. Tetapi, kelancaran sintaksis adalah sesuatu yang benar-benar kita inginkan, karena mudah dibaca dan dipelihara, serta diuji.
Pertimbangkan kode berikut, perhatikan metode getLineItems
di 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;
}
}
Apakah itu cara yang diterima untuk menerapkan sintaks yang lancar dalam Entitas tanpa melanggar prinsip-prinsip inti DDD dan OOP? Bagi saya kelihatannya baik-baik saja, karena kita hanya mengekspos lapisan layanan, bukan lapisan infrastruktur (yang bersarang di dalam layanan)