이전 게시물 (Architecture: simple CQS)의 결과로 나중에 확장 할 수있을만큼 유연한 간단한 시스템을 어떻게 구축 할 수 있었는지 생각해 왔습니다.건축 관련 질문
다른 말로하면 : 나는 지금 본격적인 CQRS에 대한 필요성을 알지 못하지만, 필요할 경우 나중에 쉽게 진화하기를 원합니다.
그래서 저는 명령에서 명령을 분리하려고 생각했지만 동일한 데이터베이스를 기반으로했습니다.
쿼리 부분은 쉬울 것입니다. 뷰를 기반으로하는 WCF 데이터 서비스는 데이터를 쿼리하기 쉽습니다. 특별한 것은 없습니다.
명령 부분이 더 어려워서 여기에 아이디어가 있습니다. 물론 명령은 비동기 방식으로 실행되므로 결과를 반환하지 않습니다. 하지만, 내 ASP.NET MVC 사이트의 컨트롤러 (예 : 구성원의 등록 성공 여부) 명령에서 피드백을 종종 필요합니다. 따라서 컨트롤러가 명령을 보내면 명령 등록 정보와 함께 전달 된 트랜잭션 ID (guid)도 생성됩니다. 명령 서비스는이 명령을 받고 상태 '처리 중'인 데이터베이스의 트랜잭션 테이블에 넣고 실행됩니다 (DDD 원칙을 사용하여). 실행 후 거래 테이블이 업데이트되어 상태가 '완료'또는 '실패'가되며 생성 된 기본 키와 같은 기타 자세한 정보가 표시됩니다.
한편 사이트에서는 QueryService를 사용하여 'completed'또는 'failed'를 수신 할 때까지이 트랜잭션의 상태를 폴링 한 다음이 결과를 기반으로 작업을 계속할 수 있습니다. 트랜잭션 테이블이 폴링되고 결과가 'completed'또는 'failed'이면 항목이 삭제됩니다.
부작용은 내 엔터티에 대한 키로 guid를 필요로하지 않기 때문에 성능과 크기에 좋은 점입니다.
대부분의 경우이 폴링 메커니즘은 필요하지 않지만 필요할 경우 가능합니다. 또한 인터페이스는 CQS를 염두에두고 설계되었으므로 미래를 위해 열려 있어야합니다.
이 접근법의 결함이 있습니까? 다른 아이디어 또는 제안?
감사합니다.
룻
왜 프런트 엔드를 WCF 데이터 서비스를 통해 분리합니까? 가능한 한 간단하게 내 솔루션을 유지하면서 구체적인 이유가 있습니까? – thekip
+1하지 WCF. 파울러의 분산 객체 디자인의 첫 번째 법칙 : PoEAA에서 객체를 배포하지 마십시오 – Deleted
+1 - @Chris Smith –