Собственно вопрос:
как правильно построить хранилище событий для системы с источником событий, которая должна уметь:
преобразовать агрегат в другой,
сохранить тот же идентификатор,
и по-прежнему сможете восстановить его из потока событий?
Теперь мой пример:
у меня есть ProspectiveCustomer
, который можно преобразовать в PayingCustomer
вот так:
ProspectiveCustomer::convertToPayingCustomer(ProspectiveCustomerId $id)
PayingCustomer сохранит тот же идентификатор, чтобы можно было отслеживать его время жизни.
Итак, теперь представьте себе следующий поток событий:
- ProspectiveCustomer был добавлен в CRM
- ProspectiveCustomer получил предложение
- ProspectiveCustomer принял предложение и поэтому был преобразован в PayingCustomer
- PayingCustomer оплатил счет
Давайте сосредоточимся на пункте 4):
У нас будет commandHandler, который получает paymentCommand {customerId: 123, amount: 500 €}. Его работа будет заключаться в следующем:
- восстановить PayingCustomer на основе его истории событий
- call PayingCustomer :: pay (Деньги, сумма в долларах)
Мой вопрос касается 1) восстановления из истории:
Служба EventStorage:
- найдите AggregateId
- загружает события (SELECT * FROM Events WHERE ID = 'xxx')
Стек событий теперь будет содержать:
- ПерспективныйКлиентWasAdded
- Перспективный заказчик
- ПерспективныйКлиентПринятоПредложение
Как может commandHandler обрабатывать PayingCustomer::reconstituteFromHistory(EventsHistory $events)
, в то время как $ events являются событиями, выданными из / применимыми к ProspectiveCustomer
ИЗМЕНИТЬ
в настоящее время я решаю проблему с PayingCustomer, имеющим собственный идентификатор, но имеющим ссылку на ProspectiveCustomerId.
Но учитывая то, что:
- это тот же ограниченный контекст,
- тот самый жизненный цикл клиента (ProspectiveCustomer заканчивается, когда начинается PayingCustomer),
это кажется беспорядочным, потому что модель теперь загрязнена двумя идентификаторами, тогда как одного должно быть достаточно.
Если бы это была не система, основанная на событиях, я бы определенно выбрал один уникальный идентификатор.
При этом, учитывая, что Event-sourcing - это просто деталь реализации, я ищу способ, чтобы оба агрегата сохраняли один и тот же идентификатор.
ProspectiveCustomerConvertedToPayingCustomer
Событие. И применить его к PropsectiveCustomer, вернув PayingCustomer - person LauDem   schedule 03.03.2016ProspectiveCustomer::convertToPayingCustomer(ProspectiveCustomerId $id)
, который генерирует событие PropsectiveCustomerConvertedToPayingCustomer ($ customerId) - person LauDem   schedule 04.03.2016