प्रश्न का लघु प्रारूप
इकाई विधि कॉल पर सेवाओं को इंजेक्ट करने के लिए डीडीडी और ओओपी की सर्वोत्तम प्रथाओं के भीतर है?
लंबा प्रारूप उदाहरण
मान लीजिए कि हमारे पास DDD में क्लासिक ऑर्डर-लाइनइमेट्स मामला है, जहां हमारे पास एक डोमेन एंटिटी है जिसे ऑर्डर कहा जाता है, जो एग्रीगेट रूट के रूप में भी कार्य करता है, और यह कि एंटिटी न केवल इसके मूल्य वस्तुओं में शामिल है, बल्कि लाइन आइटम का एक संग्रह भी है इकाइयों के लिए।
मान लें कि हम अपने आवेदन में धाराप्रवाह वाक्य रचना चाहते हैं, ताकि हम ऐसा कुछ कर सकें (पंक्ति 2 में वाक्य रचना को ध्यान में रखते हुए, जहाँ हम getLineItems
विधि कहते हैं ):
$order = $orderService->getOrderByID($orderID);
foreach($order->getLineItems($orderService) as $lineItem) {
...
}
हम किसी भी प्रकार के LineItemRepository को OrderEntity में इंजेक्ट नहीं करना चाहते हैं, क्योंकि यह कई सिद्धांतों का उल्लंघन है, जिनके बारे में मैं सोच सकता हूं। लेकिन, वाक्यविन्यास का प्रवाह कुछ ऐसा है जिसे हम वास्तव में चाहते हैं, क्योंकि यह पढ़ना और बनाए रखना आसान है, साथ ही साथ परीक्षण भी।
निम्नलिखित कोड पर विचार करें, जिसमें विधि नोट की getLineItems
गई है 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;
}
}
क्या डीडीडी और ओओपी के मुख्य सिद्धांतों का उल्लंघन किए बिना एंटिटीज में धाराप्रवाह सिंटैक्स को लागू करने का स्वीकृत तरीका है? मेरे लिए यह ठीक लगता है, क्योंकि हम केवल सेवा परत को उजागर कर रहे हैं, न कि अवसंरचना परत (जो सेवा के भीतर निहित है)