2013-04-02 1 views
1

내가 도메인 서비스가 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을 사용하고 있습니다,하지만 난 자바뿐만 아니라 최대 절전 모드 &에 동일한 원칙이 적용 믿습니다.

+0

누가 '주문'을 만드나요? 누가 saveOrder()를 호출합니까? 'Order'는 집합 루트인가 엔티티인가? 이 서비스가 실제로 응용 프로그램 계층 서비스입니까? – guillaume31

+0

컨트롤러는'Order'를 만들고, 컨트롤러는'saveOrder()'를 호출하고,'Order'는 집계 루트이며, 이것은 도메인 서비스입니다. – Benjamin

답변

0
당신은

  • 이 서비스 응용 프로그램 계층 서비스를 대신 도메인 서비스 확인 다음 옵션 중 하나 (또는 ​​둘 다)를 고려할 수 있습니다

    . 응용 프로그램 컨텍스트와 현재 사용 사례의 진행 상황을 알고 있어야하기 때문에 응용 프로그램 서비스에서 변경 추적기를 호출해도 무방합니다. 일반적인 응용 프로그램 서비스는 비즈니스 트랜잭션을 커밋합니다. 완료되면 변경 내용 추적자에게 변경 내용을 요청하므로 why not call it to generate Id's도 마찬가지입니까?

    유스 케이스의 중간에 데이터베이스가 관련되어 있다면, 데이터베이스에 바로 INSERT하지 않고 ORM이 ID를 생성하도록 NHibernate의 Guid.Comb strategy에 해당하는 것을 찾을 수 있습니다.

  • 도메인 이벤트를 사용하십시오. 창조되면, 명령서는 그것이 새롭게되었다는 것을 세상에 알릴 수 있습니다. 알림 서비스는 이벤트를 처리하고 알맞은 알림을 보냅니다. here의 예제를 볼 수 있습니다 (비즈니스 트랜잭션을 처리하는 응용 프로그램 계층 서비스도 포함됩니다).