2011-01-08 2 views
6

도메인 이벤트를 구현할 때 이벤트 처리기는 도메인 문제에만 사용해야합니다. 당신이 비즈니스 전문가들과 토론하거나 도메인 모델에 관심이있는 어떤 사람들이 사용할 수 있도록 열어 놓았습니까?도메인 이벤트 핸들러 - 응용 프로그램 계층 관련 문제에 사용해야합니까?

이 예제는 간단한 예제를 통해 가장 잘 설명 할 수 있습니다. 직원에게 작업 예약을위한 Calendar 응용 프로그램을 고려해보십시오.

우리는 다음과 같은 도메인 이벤트가있을 수 있습니다 ...

는 가 가 이

우리는 예를 들어 약속은 직원이 외부의 시간으로 이동 될 때, 이러한 이벤트에 대한 처리기를

을 AppointmentMoved AppointmentContentChanged AppointmentRemoved AppointmentAdded 근무 시간 우리는 경고 깃발을 세웠다.

물론 이러한 이벤트에 관심이있는 애플리케이션 문제가 있습니다. 일정에 약속이 추가되면 나중에 변경 작업을 수행 할 수 있도록 작업 단위에 약속을 추가해야합니다.

이러한 응용 프로그램이 도메인 이벤트의 소비자가되어야합니까, 아니면 별도의 시스템 이벤트를 발생시키고 처리해야합니까?

답변

5

DDD 솔루션에서 이벤트를 사용하는 방법은 2 가지로 잘 알려져 있습니다.

첫 번째 것은 Udi Dahan의 articles about events을 기반으로합니다. 이미 읽지 않았다면, 적극 권장합니다. 요약하면 ORM 형식의 일반적인 동작 외에도 정적 클래스 을 사용하여 이벤트를 게시한다고합니다. 따라서 고객의 주문 수집 에 주문을 추가하면 해당 이벤트가 게시됩니다. 도메인 동작은 트랜잭션 범위 내에서 실행되므로 이벤트 처리기도 실행됩니다. 또한 작업 단위에 오브젝트를 수동으로 부착하지 않도록 조언하고 조언을 찾을 수 있습니다. 새 집계 루트는 기존 규칙에서 동작을 호출하여 만들어야합니다.

그렉 영 (Greg Young)이 승격 한 또 다른 옵션이 있습니다. 기본적으로 이벤트를 지속 상태로 사용하는 이벤트 소싱을 기반으로합니다. 이 접근 방식에서 집계 루트는 일반적으로 일부 인프라 (예 : 기본 집계 루트 클래스)를 사용하여 이벤트를 적용합니다. 적용은 집계 루트 클래스 에 대한 이벤트 처리기를 호출하여 버스에서이 이벤트를 게시합니다 (사용중인 버스 구현에 관계없이).

+3

나는 그들이 그 사건을 해고하는 총체와 같은 거래에서 사건 처리를 조장하는 것을 의심한다. Udi는 이벤트 핸들러가 도메인과 아무 관련이없는 경우 (예 : 이메일 메시지) 특히 집계 트랜잭션을 외부에서 "실행 및 종료"하는 것이 더 낫다는 점을 기억합니다. "화재와 잊기"란 청취자가 메시지를 받았는지 상관하지 않지만 메시지를 발사 할 때주의해야합니다 (메시지 보내기). 집계가 끝나면 상태 변경 + 지속성 메시지를 보냅니다. 그래서 나는 끈기 후에 사건을 해고하려고합니다. – Tudor

+2

P. 이벤트는 집계에 의해 언제든지 실행될 수 있지만 집계 지속 후에 (또는 이벤트를 트리거 한 특정 명령이 완료된 후에) 실제 메시지 전달을 처리해야합니다. – Tudor

2

크로스 커팅 문제를 의미하는 경우 응용 프로그램 논리에서 요구하는 경우 어쨌든 강제로 사용해야합니다. 따라서 다른 이벤트 처리 코드와 혼합됩니다.

도메인 이벤트가 발생했을 때 여러 가지 독립적 인 작업을 수행해야하는 경우 별도의 이벤트 처리기를 사용하는 것이 좋습니다 (우려 사항 분리 원칙 참조).

첫 번째 경우 도메인 로직을 이벤트 처리 (인프라) 논리와 혼합하지 마십시오. 왼쪽 인프라/교차 분석은 도메인 메서드를 호출하는 이벤트 처리기의 코드와 관련이 있습니다. 도메인 개체의 메서드 내에서 도메인 코드를 이동합니다.

+0

이것은 합리적으로 들리 겠지만 도메인 이벤트를 발생시키는시기와 관련하여 새로운 질문으로 이어집니다. 캘린더에 약속 추가가 트랜잭션에서 수행된다고 가정하면 트랜잭션 내에서 UnitOfWork에 엔티티를 추가해야하지만 UI 업데이트는 트랜잭션 외부에서 수행되어야합니다. 이 경우 트랜잭션 내에서 도메인 이벤트를 발생시켜야합니까?UI 업데이트는 비동기 작업을 수행하는 다른 도메인 이벤트 핸들러에서 수행되어야합니다. – Andronicus

+1

도메인 이벤트는 이미 발생한 것을 나타냅니다. 따라서 이벤트 핸들러 내에서 트랜잭션을 롤백 할 수있는 기능이 없어야합니다. 트랜잭션을 커밋 한 다음 트랜잭션 중에 전송 된 모든 이벤트에 대해 이벤트 처리기를 호출합니다. –