그래서 집계 루트에서 명령을 실행하고 명령 결과로 약 10 개의 이벤트가 발생했습니다. 이 이벤트는 내부 이벤트이므로 외부 시스템에서이 이벤트를 집계해야하므로 프로젝션을 결정했습니다 (기본적으로 프로젝션 읽기). 10 개의 이벤트 (내부)에서 1 개의 이벤트 (외부) 로의이 투영을하기 위해 비즈니스 규칙 (이벤트 병합과 관련된 비즈니스 규칙)을 적용해야합니다. 이 규칙은 도메인의 일부인 것처럼 보이지만 내부 이벤트의 계획을 세우므로 여기에 어디에 넣어야합니까?CQRS 모델 프로젝션 읽기 - 비즈니스 로직
기본적으로 프로젝션 로직은 도메인의 일부이므로 집계 내에 유지하고 프로젝션이 만들어진 코드에서 호출해야합니까?
UPDATE
그래서, 하나 개의 집계 루트 안에, 내가 예를 들어,이 CarCreated (Id), CarSeatColored (Red), CarWashed (CarWashed)와 같은 모든 집계 루트 엔티티를 통해 확산되는 하나의 명령 (aggregate.createPaint 및 washatsametime (id, red))에 대한 응답으로 3 이벤트 (내부)) 등 (이 모든 3 가지 이벤트는 단일 명령으로 인해 발생합니다.) 외부 시스템은 하나의 외부 이벤트를 CarMaintainenceDone (ID, repainted = true, washed = true, somevalue = 22)으로 수신합니다.
지금, 나는이 CarMaintainenceDone 이벤트를 만들기 위해 몇 가지 복잡한 논리가있는 경우 (같은 경우 (색상 == 빨간색 다음 프로젝션 someValue와의 == 22 그렇지 않으면 44) -이 투사 코드에서 이동 또는 도메인의 일부가되어야
업데이트 2
나에게 이것은 단지 예를 때문에 그냥 도메인을 모델링하는 방법을 무시하는 당신에게 새로운 예를 제공하기 위해 노력하자. 당신이 볼 수 있듯이
우리는 단지 거기에있다 승수를 포함 AggregateRoot이 올바른 이름으로 물건을 부르십시오. 우리가 곱셈을 할 때 우리는 먼저 내부 상태를 설정하고 ObjectAHasSetParam 이벤트를 내보내는 로직을 가진 ObjectA에 정수 1을 보냅니다. ObjectB도 마찬가지입니다. 마지막으로 ObjectC는이 모든 이벤트를 수신하고 paramsHasBeenSet에서 실제 곱셈을 수행합니다. 이 경우 이벤트 저장소에서
내가 이벤트의 목록을 보존하는 것입니다 :
[ObjectAHasSetParam , ObjectBHasSetParam , ObjectCHasMultiplied ]
내 여기 지점되었다 : 나는 과정에서 하나이 모든 이벤트를 방출하는 경우 - 상태를 그 다른 사람 업데이트 것 아마도이 3 가지 사건은 오직한데 만 의미가 있기 때문에 일치하지 않을 수 있습니다. 그래서 프로젝션과 같은 것을 만들고 싶었던 것입니다.하지만이 경우에는 이벤트 대신 이벤트 목록을 함께 게시해야합니다.
class AggregateRoot{
Multiplier ml;
void handle(MultiplyCommand(1,2)){
ml.multiply(1,2);
}
}
class Multiplier{
ObjectA a;
ObjectB b;
ObjectC res;
void multiply(1,2){
a.setParam(1);
b.setParam(2);
publish(paramsHaveBeenSet());
}
}
class ObjectA{
int p;
void setParam(1){
p = 1 + 11;
publish(ObjectAHasSetParam(12));
}
}
class ObjectB{
int p;
void setParam(2){
p = 2 + 22;
publish(ObjectBHasSetParam(24));
}
}
class ObjectC{
int p1; int p2;
int res;
listen(ObjectAHasSetParam e1){
p1 = e1.par;
}
listen(ObjectBHasSetParam e2){
p2 = e2.par;
}
listen(paramsHaveBeenSet e3){
res = p1 * p2;
publish(ObjectCHasMultiplied(288));
}
}
그건 이상한 문제입니다. 컨텍스트에 대한 자세한 정보를 제공해야합니다. 이벤트가 무엇인지, 병합 중인지 등을 알려줍니다. – VoiceOfUnreason
"외부 도메인 이벤트"란 무엇입니까? –
'CarMaintainenceDone' 이벤트가 발생하면 어떻게됩니까? 'Car' Aggregate는이 이벤트를 사용하여 앞으로 수신되는 명령에 대한 동작을 수정합니까? –