প্রশ্নের সংক্ষিপ্ত বিন্যাস
সত্তা পদ্ধতি কলগুলিতে পরিষেবাগুলি ইনজেক্ট করা কি ডিডিডি এবং ওওপির সেরা অনুশীলনের মধ্যে রয়েছে?
দীর্ঘ ফর্ম্যাট উদাহরণ
ধরা যাক আমাদের ডিডিডি-তে ক্লাসিক অর্ডার-লাইনআইটেমস কেস রয়েছে, যেখানে আমাদের অর্ডার নামে একটি ডোমেন সত্তা রয়েছে, এটি সামগ্রিক রুট হিসাবেও কাজ করে, এবং সত্তাটি কেবল তার মান অবজেক্টের মধ্যেই নয়, লাইন আইটেমের সংগ্রহও অন্তর্ভুক্ত করে সংস্থাগুলো।
ধরুন আমরা আমাদের অ্যাপ্লিকেশনটিতে অনর্গল সিনট্যাক্স চাই, যাতে আমরা এরকম কিছু করতে পারি (লাইন ২-তে বাক্য গঠনটি লক্ষ করছি, যেখানে আমরা getLineItemsপদ্ধতিটি বলি ):
$order = $orderService->getOrderByID($orderID);
foreach($order->getLineItems($orderService) as $lineItem) {
...
}
আমরা অর্ডারইটিটিতে কোনও ধরণের লাইনআইটেমিপোজিটরি ইনজেকশন করতে চাই না, কারণ এটি আমি ভাবতে পারি এমন কয়েকটি নীতির লঙ্ঘন। তবে, সিনট্যাক্সের সাবলীলতা এমন কিছু যা আমরা সত্যই চাই, কারণ এটি পড়া এবং বজায় রাখা সহজ, পাশাপাশি পরীক্ষাও।
নিম্নলিখিত কোড বিবেচনা করুন, পদ্ধতি লক্ষ 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;
}
}
এটি কি ডিডিডি এবং ওওপির মূল নীতি লঙ্ঘন না করে সত্তাগুলিতে সাবলীল সিনট্যাক্স প্রয়োগের গ্রহণযোগ্য উপায়? আমার কাছে এটি দুর্দান্ত বলে মনে হচ্ছে, যেমন আমরা কেবল পরিষেবা স্তরটিই প্রকাশ করছি, পরিকাঠামো স্তরটি নয় (এটি পরিষেবাতে বাসা বাঁধার)