Kısa soru biçimi
Varlık yöntemi çağrılarına hizmet enjekte etmek DDD ve OOP'un en iyi uygulamaları dahilinde mi?
Uzun format örneği
Diyelim ki Toplama Kökü olarak da çalışan, Sipariş adı verilen bir Etki Alanı Varlığına sahip olduğumuz DDD'de klasik Order-LineItems davamız var ve Varlık sadece Değer Nesnelerinden değil, aynı zamanda bir Satır Öğesi koleksiyonundan oluşuyor Varlıkları.
Uygulamamızda akıcı bir sözdizimi istediğimizi varsayalım, böylece böyle bir şey yapabiliriz ( getLineItems
yöntemi çağırdığımız 2. satırdaki sözdizimini not ederek ):
$order = $orderService->getOrderByID($orderID);
foreach($order->getLineItems($orderService) as $lineItem) {
...
}
OrderEntity'ye herhangi bir LineItemRepository enjekte etmek istemiyoruz, çünkü bu aklıma gelen birkaç prensibin ihlalidir. Ancak, sözdiziminin akıcılığı gerçekten istediğimiz bir şeydir, çünkü test etmenin yanı sıra okunması ve bakımı kolaydır.
Yöntemi belirterek, şu kodu göz önünde bulundurun getLineItems
içinde 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;
}
}
DDD ve OOP'un temel ilkelerini ihlal etmeden, Akıcı sözdizimini Uygulamanın kabul edilen yolu bu mudur? Bana göre iyi görünüyor, çünkü yalnızca hizmet katmanını açığa çıkardık, altyapı katmanını (hizmetin içinde iç içe) değil