내가 도메인 서비스가 saveOrder()
방법, OrderService
라고 있습니다도메인 서비스 내에서 EntityManager를 플러시 할 수 있습니까?
class OrderService
{
// ...
public function saveOrder(Order $order)
{
$this->orderRepository->add($order);
// $this->entityManager->flush();
$this->notificationService->notifyOrderPlaced($order);
}
}
saveOrder()
은 (내부의 EntityManager에 persist()
를 호출) 저장소에 순서를 추가 한 다음 적절한 알림을 보낼 수있는 NotificationService로 주문을 전달합니다 (이메일, SMS).
문제는 NotificationService가 알림에 포함 할 주문 ID가 있어야하지만 주문 ID가 아직 DB에 보관되지 않았기 때문에 (ID가 자동 생성 됨) 문제입니다.
명백한 해결책은 위의 예제에서와 같이 저장소 add()
메서드 바로 다음에 OrderService에 대한 종속성으로 EntityManager를 전달한 것으로 보이며 flush()
입니다. 그러나 저는 항상 도메인 서비스가 EntityManager에 대해 인식하게하고, 저장소 나 다른 서비스에만 말하게하는 것을 선호했습니다.
- EntityManager에 종속되어있는 도메인 서비스의 단점은 무엇입니까?
- 더 좋은 방법이 있습니까?
참고 : 나는 PHP와 교리 ORM을 사용하고 있습니다,하지만 난 자바뿐만 아니라 최대 절전 모드 &에 동일한 원칙이 적용 믿습니다.
누가 '주문'을 만드나요? 누가 saveOrder()를 호출합니까? 'Order'는 집합 루트인가 엔티티인가? 이 서비스가 실제로 응용 프로그램 계층 서비스입니까? – guillaume31
컨트롤러는'Order'를 만들고, 컨트롤러는'saveOrder()'를 호출하고,'Order'는 집계 루트이며, 이것은 도메인 서비스입니다. – Benjamin