У меня есть вопрос относительно проекций, включающих несколько агрегатов в архитектуре CQRS.
Например, предположим, у меня есть два агрегата WorkItem
и Developer
, и что следующие события происходят последовательно (но не сразу)
- WorkItemCreated (workItemId)
- WorkItemTitleChanged (workItemId, title)
- DeveloperCreated (developerId)
- DeveloperNameChanged (developerId, имя)
- WorkItemAssigned (workitemId, DeveloperId)
Я хочу создать проекцию, которая будет являться «внутренним соединением» для developer-workitem:
| WorkItemId | DeveloperId | Title | DeveloperName | ... |
|------------|-------------|--------|---------------|-----|
| 1 | 1 | FixBug | John Doe | ... |
То, как яделать мои прогнозы постепенно.Это означает, что я загружаю сохраненные прогнозы из базы данных и применяю оставшиеся события по мере их поступления.
Моя проблема в том, что событие, ответственное за создание строки в таблице проекций, - WorkItemAssigned
.Однако это событие не содержит необходимой информации из предыдущих событий (название рабочего места, имя разработчика и т. Д.)
Чтобы получить требуемую информацию ко времени WorkItemAssigned
, мне нужно загрузить все событий из хранилища событий, сохраняйте состояний в памяти для всех WorkItems
и Developers
, поэтому у меня есть необходимая информация к моменту прибытия события WorkItemAssigned
.
Конечно, я мог бы получить прогноз для Workitem
, другой для Developer
и запросить их, чтобы получить их последние состояния.Но, похоже, много работы, если я хочу создать прогнозы для каждого агрегата отдельно, я мог бы также создать представление базы данных для inner-join их (На самом деле, это то, что я делаю.)
Я не делаю все это вручную, в настоящее время я использую хороший фреймворк под названием EventFlow , но он не заставляет меня отвечать на этот вопрос.
Это вопрос об основах CQRS, и я упал, я что-то здесь упускаю.