DDD 및 CRQS를 사용할 때 명령 당 정확히 하나의 이벤트 여야합니까?


17

구성에 대한 규칙을 사용하여 ddd 응용 프로그램을 디자인하는 방법을 찾고 있습니다.

집계 "클라이언트"에 "FillProfile"로 정의 된 명령이 있다고 가정하십시오. 논리적으로 "ProfileFilled"이벤트가 발생합니다.

명령이 이벤트 이상을 발생 시키거나 일부 논리에 따라 명령이 다른 이벤트를 발생시키는 경우가 있습니까? 또는 이것은 항상 1-1 관계입니까 (1 명령은 항상 없음 또는 주어진 유형의 단일 이벤트를 발생시킵니다).

이것이 사실이라면 명령이 항상 같은 이벤트를 발생시킬 것이라는 사실을 묻습니다. 그 사실에 따라 컨벤션 시스템을 구축 할 수 있습니다. "RaiseEvent"로 인해 "EventRaised"가 발생한다는 것을 알고 있습니다 ...


1
명령으로 인해 두 가지 일이 발생하면 각 일이 이벤트를 발생시킬 것으로 예상 할 수 있습니다. ProfileGenerated, ProfileSaved, 또한 모든 이벤트에서 오류가 발생하여 다시 이벤트가 발생할 수 있습니다
Ewan

또한 사소하게 시스템은 BeforeCommand, AfterCommand 등의 이벤트를 구현할 수 있습니다
Ewan

또는 명령이 반복 될 수도 있습니다. 예 : FillProfiles () profileFilled, profileFilled ....
Ewan

@ 이완, 그냥 수정하고 싶습니다. 도메인 이벤트는 오류를 생성 할 수 없습니다. 명령 만 가능합니다. 도메인 이벤트는 어떤 일이 일어 났음을 의미합니다. 명령은 어떤 일을 할 의사 가 있음을 의미 하므로 거부되거나 수락 될 수 있습니다. 즉, 도메인 이벤트가 물론 오류 로깅과 관련되지 않는 한 도메인 이벤트가 전달되기 전에 오류가 발생해야합니다.
Ludovic C

답변:


18

질문에 "CQRS"로 태그를 지정 했으므로 여기설명 된 것처럼 "CQRS & Event Sourcing"컨텍스트의 이벤트를 의미한다고 생각합니다 . 이 학습서 에서는 이벤트와 명령의 차이점을 잘 설명합니다.

  • 이벤트는 시스템의 관점에서 시스템에서 발생할 수있는 기본 "사물"을 캡처합니다.

  • 명령은 사용자가 자신의 관점에서 작업으로 간주하는 내용으로 정의됩니다.

그리고 이것은 종종 1 : 1로 대응되는 두 개의 명령과 이벤트로 이어지지 만, 이러한 다른 관점은 하나 이상의 이벤트를 발생시키는 명령 또는 명령 매개 변수에 따라 다른 이벤트를 유발할 수 있습니다. 명령이 이벤트를 전혀 발생시키지 않는 경우도 상상할 수 있지만 매우 일반적인 경우는 아닙니다.

예를 들어, 튜토리얼에서는 이벤트에 대해 언급합니다.

  • 탭 열림
  • 음료수
  • 음식 주문

명령

  • 오픈 탭
  • 주문하기

여기서 "OpenTab"명령은 "TabOpened"이벤트로 이어지지 만 PlaceOrder 명령은 "DrinksOrdered", "FoodOrdered"또는 둘 다의 이벤트로 이어집니다.

실제로 "처음부터"새로운 시스템을 설계하는 경우 명령과 이벤트 사이의 1 : 1 대응으로 시스템을 설계하고 시스템이 커질 때 얼마나 잘 확장되는지 확인할 수 있습니다. 하이브리드 방식으로 시도 할 수도 있습니다. 1 : 1로 대응되는 이벤트 및 명령 목록과 추가로 결합 된 명령이 있습니다. 디자인하려는 특정 시스템을 얼마나 멀리 이끌 수 있는지보십시오.


10

일반적으로 하나의 명령으로 하나의 이벤트가 발생합니다. 그러나 경우에 따라 둘 이상일 수도 있으며 구현에 따라 다릅니다.

명령이 다른 명령을 호출하고 각 명령이 자체 이벤트를 발생시킵니다. 또는 명령이 자체적으로 다른 작업을 수행하고 여러 이벤트를 발행합니다. 예를 들면 다음과 같습니다.

RegisterUserCommand

  • User.create (이메일, 비밀번호) → UserCreatedEvent
  • User.updateProfile (이름, 성, 위치) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent

나중에 결정하기로하면 어떻게 UserWasAddedToCrm되나요? 전체 스트림을 다시 쓰시겠습니까?
mcintyre321

@ mcintyre321 검색 안무 vs 오케스트레이션 이벤트
Benten

10

하나의 명령으로 여러 이벤트를 발생시킬 수 있습니다. 그것은 하나의 사실에 대한 논리적 결론입니다. Composite command존재합니다.

각각 이벤트를 발생시키는 두 가지 명령이 있다고 가정 해 봅시다. 그런 다음이 두 가지의 복합 명령을 작성하십시오. 복합 명령을 사용하는 하나의 관점에서 보면 명령이 두 개의 이벤트를 발생시키는 것처럼 보입니다.

따라서 단일 명령으로 여러 이벤트를 발생시키는 것을 막을 수있는 것은 없습니다.

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