끝 없는 것 같은 혼란 여부에 대해 명령 또는 안되는 값을 반환합니다. 는지 알고 싶으면 혼란이기 때문에 단순히 참가자들은 명시되지 않은 자신의 컨텍스트 또는 상황이다.
의 예는 다음과 같습니다 혼란에...
*Udi Dahan 말한 명령"오류가 발생하지 않아하는 클라이언트,"지에서 같은 문서그는 다이어그램을 보여줍니다 어디에 명령을 실제로 돌아 오류를 클라이언트입니다.
*Microsoft 눌러 저장할 문서에서는 국"명령...지 않't 응답"그러나 다음을 제공하기 위해 계속해서는 모호한 주의:
으로 전장에 경험이 성장의 주위에 CQRS,몇몇 사례를 통합하는 경향이 되는 모범 사례를 설명합니다. 부분적으로 것과는 달리 명시되...그것은 일반적인 전망의 오늘을 생각하는 명령어 처리기와 응용 프로그램을 필요로 하는 방법을 알고 트랜잭션 작업을 갔습니다. 결과를 알고 있어야...
*지미그 says"명령은 항상 그 결과"그러나게 여분의 노력을 보여주는 방법을 명령을 반환효합니다.
라 명령을 처리기 값을 반환 또는지?
방에서 큐 지미그's"CQRS 신화,"나는 생각한 응답(s).이 질문에 따라 달라집 프로그램별"상"당신의 말하기:
+-------------+-------------------------+-----------------+
| | Real-time, Synchronous | Queued, Async |
+-------------+-------------------------+-----------------+
| Acceptance | Exception/return-value* | <see below> |
| Fulfillment | return-value | n/a |
+-------------+-------------------------+-----------------+
명령"동"주로 말하는 유효성 검사를 수행합니다. 아마도 유효성 검사 결과를 주어 동기적으로 호출자에게는지 여부를 명령"이행"은 동기식 또는 대기 중입니다.
그러나,그것은 많은 실무자 don't 를 시작하는 유효성 검사에서 명령을 처리기입니다. 에서 나는 무엇've seen,그것은 하나 때문에(1)그've 이미 발견되는 환상적인 방법을 처리하는 유효성 검사에서 응용 프로그램 계층(즉 ASP.NET MVC 컨트롤러를 확인하는 유효한 상태를 통해 데이터 주석)또는(2)아키텍처는 장소에서 명령을 제출하는(의 프로세스)버스 또는 큐가 있습니다. 이 후기 형태의 숙지는 일반적으로 don'티 제공하는 동기식 유효성 검사 기능이나 인터페이스가 있습니다.
에 짧고,많은 디자이너 설정하려는 경우가 있습니다 명령 처리를 제공하는 유효성 검사 결과(동기)반환 값이지만,그들은 함께 살아야의 제한 사항들을 숙지 도구를 사용할 수 있는 지를 확인합니다.
에 관한"이행"의 명령,클라이언트는 발행 명령을 수도 있습을 알아야 scope_identity 에 대한 새로 만든 기록 또는 아마도 오류 정보-등과 같"계정과."
에 실시간 설정을 것 같다는 반환 값이 만드는 가장 의미 예외가되지 않아야 통신하는 데 사용되는 비즈니스 관련 실패 결과입니다. 그러나,"큐"상황에 반환 값을 자연스럽게 만들지 않습니다.
이것은이 모든 혼란을 할 수 있도 요약:
많은(가장?) CQRS 종사자 가 그들은 지금,또는 미래에 통합하는 숙지 프레임워크 또는 플랫폼(버스 또는 큐)고 이렇게 선포하는 명령 처리기하지 않는 값을 반환합니다. 그러나,일부 실무자의 의도를 사용하여 이러한 이벤트 기반의 구성,그리고 그들은 보증하는 명령 처리기(동기)값을 반환합니다.
그래서 예를 들어,내가 믿는 동기(요청-응답)컨텍스트었다고 가정할 때지미그 제공하는 이 예제 명령 인터페이스:
public interface ICommand<out TResult> { }
public interface ICommandHandler<in TCommand, out TResult>
where TCommand : ICommand<TResult>
{
TResult Handle(TCommand command);
}
그 Mediatr 제품,후에,모든 메모리 도구입니다. 주어진 이 모든 생각은 이미신중하게 시간이 걸렸을 생산하는 반환에서 명령되지 않았기 때문이"명령을 핸들러가 없어야 값을 반환,"지만,대신하기 때문에 그는 단순히 원하는 자신의 중재자는 클래스를 일관성 있는 인터페이스::
public interface IMediator
{
TResponse Request<TResponse>(IQuery<TResponse> query);
TResult Send<TResult>(ICommand<TResult> query); //This is the signature in question.
}
...되지 않음에도 불구하고 모든 명령어 의미 있는 값을 반환합니다.
내가 올바르게 캡처있는 이유에 혼란을 이 항목? 뭔가가 나는'm 이 없는가?
다음과 같은 조언에서태클 복잡성에 CQRS의 Vladik Khononov 건의 명령을 처리할 수 있습 반환에 관한 정보의 결과입니다.
을 위반하지 않고 어떤[CQRS]원칙을,명령할 수 있는 안전하게 반환한 다음 데이터:
-실행 결과:성패; -오류 메시지 또는 유효성 검사 오류의 경우에는,실패; -집계의 새로운 버전 번호의 경우에는,성공
이 정보를 획기적으로 개선하의 사용자 경험하기 때문에:
-지 설문 외부 원본 명령을 실행할 수 있습니다. 된 사소한 유효성을 검사하고 명령을 반환하는 오류 메시지를 가지고 있습니다. -만약 당신이 원하는 새로 표시된 데이터를 사용할 수 있습 집계의 새로운 버전을 확인하는지 여부를 보기 모델을 반영한 명령을 실행 또는 아닙니다. 더 표시하는 오래 된 데이터가 있습니다.
다니엘 휘태커 옹호자로 돌아 a"일반적인 결과"체에서 명령 처리를 포함한다.
라 명령을 처리기 값을 반환 또는지?
그들은 반환하지 않아야 합니다*비즈니스 데이터가 보이지 않지만 메타데이터(에 관한 성공 혹은 실패의 명령을 실행하). CQRS
는CQS높은 수준의 촬영. 는 경우에도 당신은 끊 순정's 규칙 및 반환,무엇이겠습니까? 에 CQRS 명령을 처리하는 방법에는응용 프로그램 서비스
로드하는집
다음 메소드를 호출에서집
그때 그것을 지속되면서집
. 려의 처리기 명령이 수정하는집
. 지't know what 를 반환하는 것 독립적인 발신번호를 입력하실 수 있습니다. 모든 명령을 처리기자/클라이언트를 원하는 것을 알고 뭔가 다른 사람에 대한 새로운 상태입니다.
면 명령행을 막고(일컬어 동기식)다음의 모든 것을 알아야는 경우에는지 여부를 명령을 성공적으로 실행 또는 아닙니다. 그런 다음,더 높은 층을 쿼리 정확한 것은 당신에 대해 알 필요가 새로운 응용 프로그램's 의 상태를 쿼리하는 모델은 최고의 장착을 필요합니다.
생각하는 경우에는 반환에서 뭔가를 명령 처리를 제공 그것은 두 개의 책임:1. 수정 집계 상태 2. 쿼리를 읽 모델입니다.
에 관한 명령의 유효성,적어도 두 가지 유형의 명령을 확인:
그러나,만약 우리가 어떤 수준에프레젠테이션 레이어
(i.e.aREST
끝점)클라이언트는응용 프로그램의 레이어
우리는 반환 할 수 있습니다 아무것도 우리는'규칙을 어기 때문에 끝점은 사용 후에는 경우에,당신은 당신이 정확히 알고 싶어 반환 후 명령이 실행되는,모든 사용 사례입니다.
CQRS 및 CQS 은 다음과 같 마이크로 서비스,그리고 클래스를 분해:기본 아이디어가 동일("하는 경향이있는 작은 응집 모듈")지만,그들은 거짓말을 다른 의미한 수준.
점 CQRS 을 읽기/쓰기 모델을 분리;그러한 낮은 수준 정보에는 반환 값에서 특정 방법은 완전히 무관하다.
통지에는 다음Fowler's 견적:
는 변경 CQRS 소개입을 분할하는 개념적 모델로 별도의 에 대한 모델을 업데이트 및 디스플레이에 참조로 명령을 쿼리는 각각 다음의 어휘 CommandQuerySeparation.
그것은 대델,지 않*방법.
명령을 핸들러를 반환할 수 있습니다 아무것도를 제외하고 읽기 모델:상태를(성공/실패),생성된 이벤트(it's 의 기본 목표는 명령을 처리기,btw:을 생성 이벤트에 대한 특정 명령),오류가 있습니다. 명령 처리기에 자주 던지 예외가되지 않은,그것은 예의 출력 신호에서 명령을 처리기입니다.
또한,저자의 이 용어를,그 젊은이 말하는 명령은 항상 동기화(그렇지 않으면,그것은 이벤트): https://groups.google.com/forum/#!항목/dddcqrs/xhJHVxDx2pM
그렉 젊
실제로 내가 말하는 비동기 명령어는't 존재합니다:) 그 실제로 다른 이벤트입니다.
답변에 대한@콘스탄틴 Galbenu,내가 직면한 제한.
@싫어하는 정확히 무엇을 하는 사람들과 이벤트?
@콘스탄틴 Galbenu,대부분의 경우 나는't 그들이 필요로 결과의 명령은 물론이다. 어떤 경우에-나에게 알려야 하는 클라이언트에의 응답이 이 API 는 요청을 합니다.
It's 때 매우 유용:
고 제공할 수 있습니다 예로한 경우입니다. 우리가 상상하 Tinder 같은 서비스,우리는 LikeStranger 명령입니다. 이 명령될 수 있습 StrangersWereMatched 는 경우 우리 같은 사람은 이미 우리를 좋아했다. 우리에게 알려야 하는 모바일 클라이언트에 반응할지 여부가 일치하는 일어나지 않습니다. 하려면 체크인 matchQueryService 후,명령에 당신을 찾을 수 있습 경기가 있지만,없을 보증하는 경기 일어난 지금, 기 때문에 때로는 Tinder 보여주는 이미 일치하는 낯선 사람(아마,에 거주 지역,어쩌면 불일치,아마 당신은 단지는 2 장치,etc.).
인 경우 응답 StrangersWereMatched 정말 일어난 지금 그렇게 간단합니다:
$events = $this->commandBus->handle(new LikeStranger(...));
if ($events->contains(StrangersWereMatched::class)) {
return LikeApiResponse::matched();
} else {
return LikeApiResponse::unknown();
}
예,당신은 도입할 수 있는 명령 id,예를 들어,과 일치 읽 모델 to keep it:
// ...
$commandId = CommandId::generate();
$events = $this->commandBus->handle(
$commandId,
new LikeStranger($strangerWhoLikesId, $strangerId)
);
$match = $this->matchQueryService->find($strangerWhoLikesId, $strangerId);
if ($match->isResultOfCommand($commandId)) {
return LikeApiResponse::matched();
} else {
return LikeApiResponse::unknown();
}
...하지만 그것에 대해 생각:는 이유는 무엇이라고 생각하는 첫 번째 예에서는 간단한 논리는 더?
그't 을 위반하 CQRS 어쨌든 난 그냥 만든 암시적 분명하게 명시되어 있습니다.
그것은 무 변경할 수 없는 접근 방식이다. 더 적은 기회를 칠 버그(예를 들면matchQueryService
캐시/지연[아이 즉시 일치],당신은 문제가).
예을 때,사실의 일치하는 충분하지 않고 당신은 필요한 데이터를 얻을 수 있에 대한 응답,당신은 당신을 사용하여 쿼리 서비스를 제공합니다. 하지만 아무것도 막을 받을 수 있는 이벤트에서 명령을 처리기입니다.