と呼ばれるドメイン サービスがありOrderService
、次のsaveOrder()
メソッドがあります。
class OrderService
{
// ...
public function saveOrder(Order $order)
{
$this->orderRepository->add($order);
// $this->entityManager->flush();
$this->notificationService->notifyOrderPlaced($order);
}
}
saveOrder()
注文をリポジトリに追加し ( persist()
EntityManager を内部的に呼び出します)、注文を NotificationService に渡して、適切な通知 (電子メール、SMS) を送信します。
問題は、NotificationService が通知に含める注文 ID を必要とする一方で、DB に永続化されていない (ID は自動生成される) ため、注文にはまだ ID がないことです。
明らかな解決策は、上記の例のように、EntityManager を OrderService への依存関係として、リポジトリメソッドflush()
の直後に渡すようです。add()
しかし、私は常に、ドメイン サービスが EntityManager を認識できるようにすることに消極的でした。ドメイン サービスがリポジトリや他のサービスとのみ通信できるようにすることを好みました。
- EntityManager に依存するドメイン サービスの欠点は何ですか?
- より良い代替手段はありますか?
注: 私は PHP と Doctrine ORM を使用していますが、Java と Hibernate にも同じ原則が当てはまると思います。