Я создаю приложение с моделью домена с использованием концепций CQRS и доменных событий (но без источника событий, просто старого SQL). Не было никаких проблем с событиями SomethingChanged. Затем я застрял в реализации событий SomethingCreated.
Когда я создаю какой-либо объект, который сопоставляется с таблицей с идентификационным первичным ключом, тогда я не знаю Id до тех пор, пока объект не будет сохранен. Сущность - это непротиворечивость, поэтому при публикации события изнутри объекта Id просто неизвестен - он волшебным образом задан после вызова context.SaveChanges(). Итак, как/где/когда я могу поместить Id в данные события?
Я думал:
- Включает ссылку на объект в событии. Это будет работать внутри домена, но не обязательно в распределенной среде с несколькими автономными системами, сообщающими событиями/сообщениями.
- Переопределить SaveChanges(), чтобы как-то обновлять события, помещенные в очередь для публикации. Но события должны быть неизменными, поэтому это кажется очень грязным.
- Избавление от полей идентификации и использование GUID, сгенерированных в конструкторе сущности. Это может быть самым простым, но может поразить производительность и сделать другие вещи сложнее, например отладки или запросы (
where id = 'B85E62C3-DC56-40C0-852A-49F759AC68FB'
, noMIN
,MAX
и т.д.). Это то, что я вижу во многих примерах приложений. - Гибридный подход - оставить личность и использовать ее главным образом для внешних ключей и более быстрого объединения, но использовать GUID как уникальный идентификатор, с помощью которого я вывожу сущности из репозитория в приложении.