DDD : 도메인 이벤트 핸들러를 어디에 배치합니까? 적합한 계층에

도메인 이벤트 핸들러를 DDD에 배치하는 데 가장 적합한 계층에 대한 의견을 말씀해 주시겠습니까? 예를 들어, 새 계약을 추가 할 수있는 응용 프로그램 서비스가 있으며 계약이 추가되면 담당자에게 전자 메일 알림을 보내려고합니다. 전자 메일 보낸 사람 (ContractAdded 이벤트를 처리하는) 응용 프로그램 서비스 또는 도메인 서비스 또는 다른 것?



답변

도메인 이벤트 처리기를 응용 프로그램 계층에 배치합니다.

도메인 이벤트는 외부 계층 (또는 외부 세계)에 도메인 계층에서 어떤 일이 발생했음을 알리는 방법입니다. 이벤트와 관련된 작업은 응용 프로그램에 따라 다릅니다. 응용 프로그램은 변경 사항을 사용자에게 알리거나 다른 도메인을 호출하여 작업을 수행 할 수 있습니다. 응용 프로그램은 사용자 작업, 웹 요청 또는 도메인 이벤트에 대한 반응으로 도메인 작업을 조정합니다.


답변

원본 DDD 서적 (Evans 2004)에서는 응용 프로그램 계층을 사용자의 작업에 응답하여 도메인 개체를 연습하는 얇은 계층으로 설명합니다. 따라서 도메인 이벤트에 대한 일반적인 이벤트 처리기는 응용 프로그램 계층에 속하지 않습니다.

상향 종속성을 생성하여 계층화를 중단하지 않는 한 일부를 도메인 계층에 배치하는 것이 좋습니다.

도메인 계층 아래에 ​​인프라 계층이있는 경우 계층을 손상시킬 수 있으므로 이벤트 핸들러가있을 수 없습니다.

도메인 계층 위에있는 어댑터 계층이있는 경우 여기에서 이벤트 핸들러를 작성할 수 있습니다. 육각형 아키텍처를 확인하십시오 .


답변

도메인 이벤트 처리기를 도메인 계층에 도메인 인터페이스로 배치 IDomainEventHandler합니다.

도메인 이벤트 처리기의 예는 새 트랜잭션을 초기화하기 위해 (예 : 새 도메인 명령을 트리거하기 위해) 특정 도메인 이벤트를 구독하는 정책입니다. 따라서 도메인 계층에 관련이 있으므로 비즈니스 로직.

주문이 확정되어 송장 요청을 작성해야하는 예를 생각할 수 있습니다. 우리 OrderConfirmedEvent는 일어난 사건 이 있습니다. 우리 도메인의 정책은이 이벤트를 구독 RequestInvoice하고 명령 핸들러가 처리하고 그에 따라 처리 할 도메인 명령 을 작성하는 역할을합니다 .

애플리케이션 계층에이 이벤트 핸들러가있는 경우 사용자 조치를 조정하는 것 외에도 애플리케이션 계층이 일부 비즈니스 로직을 실행한다는 것을 의미합니다.

그러나 우리는