나는 CQRS 및 이벤트 소싱으로 첫 번째 진출에 뛰어 들고 있으며 몇 가지 지침이있는 몇 가지 ID를 가지고 있습니다. 저는 SO 스타일 평판 시스템을 구현하고 싶습니다. 이것은이 아키텍처에 가장 적합합니다.CQRS 및 이벤트 소싱을 사용하는 SO 스타일의 평판 시스템
예를 들어 그대로 유지하십시오. 질문이 올라가면 UpvoteCommand
이 발생하여 총 점수가 올라가고 QuestionUpvotedEvent
이 발생합니다.
평점 점수를 높일 수있는 QuestionUpvotedEvent
을 구독해야하는 사용자 집계와 비슷합니다. 하지만 어떻게/언제이 구독을하는 것이 나에게 명확하지 않습니까? Greg Youngs의 예에서 이벤트/명령 처리는 global.asax에서 처리되지만 집계 ID를 기반으로하는 라우팅은 포함되지 않습니다.
모든 사용자 집합체가 올바른 것으로 보이지 않는 모든 QuestionUpvotedEvent
에 가입하는 것처럼 보입니다. 그러한 구성표 작업을 만들기 위해 이벤트 처리기는 해당 사용자가 방금 upvoted 질문을 소유했는지 식별해야합니다. Greg Young은 단순히 상태 변경을 포함해야하는 이벤트 처리기 코드에 있어서는 안된다고 암시합니다.
여기에 무엇이 잘못 되었습니까?
모든 안내 사항에 감사드립니다.
편집
나는 우리가 여기서 얘기하는 것은 질문 & 사용자 골재 사이의 상호 집계 통신 것 같다. 내가 볼 수있는 한 가지 해결책은 QuestionUpvotedEvent
이 ReputationEventHandler
에 가입하여 해당 사용자 AR을 가져 와서 해당 개체에 대해 해당 메서드를 호출 할 수 있다는 것입니다. YourQuestionWasUpvoted
. 그러면 사용자 특정 UserQuestionUpvoted
이벤트가 생성되어 향후 재생 기능이 보존됩니다. 이 방향이 바른가요? 2
편집은 또한 구글 그룹 here에 대한 설명을 참조하십시오.
집계가 이벤트 핸들러에 가입하는 예제를 보았지만 문제가 복잡하다고 생각합니다. – madcapnmckay
제안 된 솔루션이 마음에 듭니다. 외부 조정자 서비스가 로직을 수행한다는 점에서 Tom이 제안한 솔루션과 비슷합니다. 제가 처음에 피하고 싶었던 것은 명성이 이벤트에 참여함으로써 증가한 가치를 지니고 있다는 것입니다. 내가 당신의 솔루션에서 볼 수있는 유일한 단점은 질문을 상대로 평판이 높아진 가치를 변경하면 쉽게 재 계산할 수 없다는 것입니다 (SO가 과거에 한 것처럼). 상황에 따라 플러스로 볼 수도 있지만 재조정 할 능력이 필요합니다.흥미로 웠던 것은 많은 다른 해결책을 촉발 시켰습니다 (편집 참조). – madcapnmckay
명성이 이벤트에서 증가한 금액을 반드시 입력해야하는지 확실하지 않습니다. 투표 금액이 방금 쿼리 측면에 저장 될 수 있으며 'UserQuestionVotedUpEvent'이벤트가있을 수 있습니다.이 이벤트는 처리 될 때 현재 투표의 가치를 조회하고 그 금액만큼 사용자 평판을 증가시킵니다. 최대 득표의 가치를 바꾸는 것은 업데이트 쿼리의 경우 일뿐입니다. 물론 이것은 도메인 자체가 사용자의 실제 평판 점수와 관련이없는 경우에만 작동합니다. –