도메인 이벤트를 사용하거나 응용 프로그램 계층이 모든 것을 조정하도록하는 방법


27

첫 번째 단계를 도메인 기반 디자인으로 설정하고 청서를 구입했으며 특정 솔루션을 구현하는 세 가지 방법을보고 있습니다. 기록을 위해 : 나는 CQRS 또는 이벤트 소싱을 사용하지 않습니다.

사용자 요청이 응용 프로그램 서비스 계층으로 들어 온다고 가정 해 봅시다. 해당 요청의 비즈니스 로직은 (어떤 이유로 든) 엔티티의 메소드와 도메인 서비스의 메소드로 구분됩니다. 이러한 메소드를 호출하려면 어떻게해야합니까?

지금까지 수집 한 옵션은 다음과 같습니다.

  • 응용 프로그램 서비스가 두 메소드를 모두 호출하도록하십시오
  • 메소드 인젝션 / 이중 디스패치를 ​​사용하여 엔티티에 도메인 서비스를 주입 한 후 엔티티가하는 일을 도메인 서비스의 메소드를 호출하게하십시오 (또는 다른 방법으로 도메인 서비스가 엔티티의 메소드를 호출하게 함)
  • 엔티티 메소드에서 도메인 이벤트를 발생시킵니다. 핸들러는 도메인 서비스를 호출합니다. (내가 이야기하는 도메인 이벤트의 종류는 다음과 같습니다. http://www.udidahan.com/2009/06/14/domain-events-salvation/ )

나는 이것들이 모두 가능하다고 생각하지만, 그것들 중에서 선택할 수는 없습니다. 나는 이것을 오랫동안 생각해 왔으며 더 이상 세 가지의 의미 론적 차이를 볼 수없는 시점에 도달했습니다. 무엇을 사용해야 할 때 몇 가지 지침을 알고 있습니까?


1
도메인 이벤트에 관한 정보에 대한 흥미로운 링크에 감사드립니다.
JW01

이 두 메소드를 특정 순서로 호출해야합니까?
SpaceTrucker

@SpaceTrucker 내 특정 경우에는 실제로 중요하지 않습니다. 그러나 내가 언급 한 각 옵션에서 원하는 경우 메소드 실행을 주문할 수 있습니다.
dvdvorle

답변:


19

응용 프로그램 서비스가 두 메소드를 모두 호출하도록하십시오

응용 프로그램 서비스는 일반적으로이를위한 좋은 시작이지만 항상 가능한 한 엔티티에 가까운 동작을 이동해야합니다. 응용 프로그램 서비스는 오케스트레이션 역할을 수행하며 도메인 동작을 실행하기위한 단계를 설정하므로 필요한 모든 종속성을 제공합니다. 그러나 가능하면 동작을 도메인 모델에 위임해야합니다.

메소드 인젝션 / 이중 디스패치를 ​​사용하여 엔티티에 도메인 서비스를 주입 한 후 엔티티가하는 일을 도메인 서비스의 메소드를 호출하게하십시오 (또는 다른 방법으로 도메인 서비스가 엔티티의 메소드를 호출하게 함)

더 많은 동작이 엔티티 또는 도메인 서비스에 위임되기 때문에이 방법이 더 좋습니다. 이를 구현하는 가장 분리 된 방법은 엔티티가 서비스에 대한 종속성을 표현하도록하는 것이 현재의 동작을 제공하는 메소드의 매개 변수입니다.

엔티티 메소드에서 도메인 이벤트를 발생시킵니다. 핸들러는 도메인 서비스를 호출합니다.

Udi와 Evans 자신이 설명했듯이 도메인 이벤트 패턴은 매우 다양하며 다양한 시나리오에 적용될 수 있습니다. 그러나 몇 가지 합병증이 있습니다. 먼저, 도메인 이벤트 게시자 내에 적절한 범위가 있는지 확인해야합니다. 대부분의 경우 도메인 이벤트 핸들러에는 종속성이 있으며 IoC 컨테이너를 사용하는 경우 적절한 인스턴스가 삽입되어 있는지 확인해야합니다. 예를 들어 웹 애플리케이션에서[ThreadStatic]속성은 범위 지정에 문제가 있습니다. 또 다른 복잡성은 전사 경계의 복잡성입니다. 엔티티가 도메인 이벤트를 발생 시키지만 이후 데이터베이스에 대한 커미트에 실패하면 모든 도메인 이벤트 핸들러가 롤백 할 방법이 필요하며 그렇지 않으면 유효하지 않은 이벤트가 발생하므로 트랜잭션을 고려해야합니다. 그러나 이러한 기반을 다룬 경우 도메인 이벤트는 엔티티 자체 내에 도메인 논리를 캡슐화하는 데 좋은 패턴입니다.

접근법 2와 3의 차이점은 사용 사례에 따라 다릅니다. 도메인 이벤트는 과거 시제 인 이벤트에 대한 응답으로 추가 동작을 호출하려는 경우에 적용됩니다 . 도메인 이벤트 핸들러는 엔티티의 동작에 영향을 줄 수 없기 때문에 이것은 중요한 제약입니다. 반면, 접근 방식 2에서는 주입 된 서비스가 특정 동작에 대한 종속성으로 선언되기 때문에 동작에 영향을 줄 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.