2013-10-11 3 views
1

CQRS에서는 명령과 쿼리를 분리합니다. 내가 이해하는 바와 같이, 명령은 Entity 상태를 수정할 수있는 도메인 이벤트를 발생 시키지만, 쿼리는 특정 DTO를 데이터 저장소에서 직접 반환합니다. this article에 따르면 UI는 각 CommandHandler가 처리하는 Command를 생성하는 Command Bus를 통해 명령을 내린다. CommandHandler는 Domain Logic을 조직하여 도메인 이벤트의 발생을 판별하고 Repository에 대한 상태 변경을 지속/게시한다 (Event Sourcing). 유지 된 후에 상태 변경은 쿼리를 통해 사용할 수 있습니다.CQRS 즉시 데이터 저장소에 저장되지 않는 엔티티를 저장하고 쿼리하는 방법을 명령합니다.

이제 명령을 사용하여 이 즉시 보존 또는 게시되지 않는 엔터티를 생성하는 경우? 첫째로, 그 아직 지켜지지 않은 단체는 어디에서 개최됩니까? 명령 버스, 명령 처리기, 저장소에 있습니까? 아니면 새로운 씬 응용 프로그램 계층에 보유해야합니까? 쿼리가 어떻게 액세스해야합니까?

문제는 여기에 CQRS가 ALL 엔티티는 IMO가 반드시 모든 도메인과 호환하지 않은, 생성시 지속 할 것을 요구하지 않는 한 unpersisted 엔티티는, 지속 엔티티와는 크게 다를 것이 어떤 쿼리처럼 보인다는 것이다.

특히 저는 다양한 교육 세션을위한 교육 정보를 기록하는 소프트웨어를 제작하려고합니다. 그러나 Training Sessions가 으로 수동으로 저장되는 경우 항상 생성시와 달리 세션 저장 버튼에 의해 수동으로 유지되는 것이 좋습니다. StartNewTrainingSessionCommand가 새 교육 세션을 저장할 위치를 알 수 없으므로 데이터 저장소에없는 경우 쿼리 할 수 ​​있습니다.

답변

1

나는 당신이 일을 조금 잘못 이해했다고 생각한다. 명령은 서비스 버스를 통해 업무를 수행하기 위해 비즈니스 객체를 사용하는 명령 처리기로 보내진다. 도메인 이벤트는 비즈니스 (도메인) 객체에 의해 생성되어야하지만 때로는 명령 처리기에서도이를 수행합니다.

생성 된 엔티티가 저장되지 않는 이유가 표시되지 않습니다. 특별한 경우 도메인에서 허용하는 경우 사용자가 저장 버튼을 누르면 자동으로 저장된 빈 TrainingSession을 업데이트 할 수 있습니다.

이 방법을 사용할 수 없다면 입력 데이터를 저장하고,보기 모델을 임시 위치 (세션, db)에 저장하고 사용자가 버튼을 클릭 할 때만 명령을 실행하면됩니다.

+1

새 TrainingSession을 "in memory"저장소에 저장하고 사용자가 Save (저장)를 클릭하면 db Repository에 저장하는 것이 합리적입니까? – user2852952

+1

실제 저장소로 전송 될 때까지 임시 위치에 저장하는 것이 좋습니다. 데스크톱 응용 프로그램이라면 메모리에있는 것이 좋습니다. – MikeSW

+0

MikeSW와 완전히 동의합니다. 요구 사항 인 경우 일시적인 데이터를 일종의 캐시로 유지하십시오. 그런 다음 사용자가 데이터를 '저장'하면 AR/Saga에 도메인 모델을 업데이트하라는 명령을 보냅니다. 읽기 모델은 AR에 의해 생성 된 도메인 이벤트에 대한 응답으로 업데이트됩니다. –