2017-02-28 10 views
0

잠시 동안 내 마음이 바뀌어서 좋은 해결책을 찾지 못하는 디자인 문제가 있습니다. CQRS와 도메인 경계에 관한 것입니다.명령 실행시 여분의 경계 데이터

내가 컨텍스트를 가지고 있다고 가정 해 보겠습니다. 시스템에 대한 예약 및 이벤트를 취하는 것입니다. 이 시스템은 단일 이벤트 (이미 완료되었거나 문제 없음)에 링크 된 단일 예약을 허용하며, 주간 예약은 이벤트 모음과 연결됩니다. 주간 예약은 요일을 정의하여 수행됩니다 (추가 데이터는 관련 없음). 매주 예약은 항상 시작 및 종료일 (반년)이 있습니다.

시스템에는 정상적인 날과 작동하지 않는 날의 두 가지 유형이 있습니다. 이벤트를 개최 할 수 없습니다.

비즈니스 요청에 따라 사용자는 매주 예약 할 때 시스템만으로는 근무일이 아닌 특정 이벤트를 취소하기를 원합니다.

실제로 예약과 이벤트는 두 개의 테이블에 저장됩니다. 이벤트가 특수 플래그와 함께 저장되면 취소됩니다. 비즈니스 컨텍스트에서 사용한 적이 없기 때문에 나는이 테이블과 관련이 없습니다. 비즈니스 경계 (다른 작은 데이터와 관련이없는)가 지금까지 훌륭하게 작동했습니다.

여기 내 문제가 있습니다. 사용자 요청 (모든 삭제 된 날짜에 대해 일정 만들기)을 충족시키기 위해서는 모든 요일에 대한 정보가 필요합니다 (동일한 요일에있는 요일 만 있으면 충분합니다). 그러나이 정보를 얻으려면 어떻게해야합니까?

내 가능한 해결책 : 루트 엔티티에서 반년의

  1. 로드 모든 일. 이것은 정말 무거울 수 있으며 비즈니스 경계를 ​​확장해야합니다.
  2. 명령을 사전 처리하여 추가 정보가있는 명령을 만듭니다. 그것은 명령의 명령 일 것입니다, 제가 읽은 것은 위험합니다. 그게 충분 해.
  3. 잘못된 날짜 목록으로 명령을 확장하십시오. 하루가 유효하지 않은지 어떻게 확인합니까? 실제 테두리 바깥에있는 데이터에 액세스해야합니다. 즉, 1과 같습니다.
  4. 작동하지 않는 요일 목록을 가져 오려면 명령 처리기에서 사용되는 서비스를 만듭니다. 일일 컨텍스트 정보는 공통 (또는 공유) 컨텍스트로 이동됩니다.
  5. 주별 이벤트에 대한 이벤트 수신기를 만듭니다. 주별 이벤트가 생성되면 작업하지 않은 요일 (해당 반기 중 그 요일) 목록을로드하고 해당 요일을 취소하기위한 일련의 명령을 실행합니다. 이렇게하면 공통된 컨텍스트에 여분의 데이터를 추가하지 않고 다른 목적으로 같은 코드 (이벤트 취소)를 재사용하지 않고 경계를 봉인합니다.

어떤 솔루션이 가장 좋을까요?

답변

1

리트머스 테스트 : 근무일이 근무하지 않는 날과 그 날의 주간 예약에 어떤 일이 발생하는지 이해 관계자에게 질문하십시오. 또한 근무하지 않는 날이 근무일로 바뀌고 에 예약 할 때 발생하는 일은 일입니다.

주간 이벤트의 이벤트 리스너를 만듭니다. 주별 이벤트가 생성되면 작업하지 않은 요일 (해당 반기 중 그 요일) 목록을로드하고 해당 요일을 취소하기위한 일련의 명령을 실행합니다. 이렇게하면 공통된 컨텍스트에 여분의 데이터를 추가하지 않고 다른 목적으로 같은 코드 (이벤트 취소)를 재사용하지 않고 경계를 봉인합니다.

닫기 귀하가 작성한 것에 대한 이해를 바탕으로합니다.

내 마음에는 실제로 두 개의 서로 다른 집계가 있습니다. 당신은 매주 예약의 정의를 가지고 있으며, 다른 예약에서 이벤트를 수집하는 일일 일정을가집니다.

예약을 만들 때 시작일, 종료일, 요일 및 해당 범위의 요일 목록을 반환 할 수있는 도메인 서비스가 입력됩니다. 생각 일정 또는 여정 - 우리는이 특정 예약의 후보 일을 정의합니다.

새 이벤트를 볼 때 이벤트 수신기는 해당 특정 요일에 대한 일정 집계에 명령을 실행하고 일일 예약에서 요청한 이벤트를 추가합니다. 스케줄은 그것이 "휴무일"인지 아닌지를 알기 때문에 일정 또는 취소 된 각 이벤트를 표시 할 수 있습니다 (해당 정보를 명시 적으로 나타내려면 작업 일의 상태를 암시 적으로 남겨 둘 수 있음) 일부 시스템에서는).

비어있는 일정은 사전에 만들거나 일부 일반 레시피를 사용하여 작업 일 여부를 결정할 수 있으며 현재 도메인의 일부인 경우 자신의 작업 상태에 대한 변경을 지원할 수 있습니다.

중요한 아이디어는 비 근무 일은 도메인 모델의 일부이며 여러 예약 개체에 걸쳐 있으므로 명확하게 예약 집계 외부에있는 엔터티입니다.

+0

따라서 제안을 정확하게 이해했다면 마지막 옵션이 가장 좋습니다. 두 가지 목적을 가진 두 개의 집계 및 허용되지 않는 이벤트 목록으로 주별 예약을 "업데이트"하는 이벤트 수신기. –