Я новичок в Event Sourcing и планирую использовать его для промышленного применения для отслеживания соединений между резервуарами, трубами и различными физическими компонентами на производственном объекте.
Моя первоначальная идея заключалась в использовании команд и событий.такие как ConnectPipeToTank
→ PipeConnectedToTank
.Однако «книга рекордов» - это не само приложение, а то, что физически происходит на производственном объекте.Поэтому более целесообразно использовать команды и события, такие как ReportPipeConnectedToTank
→ PipeConnectedToTankReported
.
. Такое событие все еще является фактом, но на самом деле это не что иное, как отчет / утверждение /записать, что пользователь сделал в определенный момент времени о том, что произошло в другой момент времени.Другие пользователи будут принимать решения на основе этих отчетов.
Но, разумеется, ничто не гарантирует точности этих отчетов (опечатки, злонамеренные записи, неполные знания во время ввода и т. Д.).Таким образом, нам нужен способ исправить отчет, не удаляя знания о том, что отчет был неверным в какой-то момент времени: мы должны иметь возможность вносить изменения в отчет.Мы хотим, чтобы двухвременная система могла выполнять аудиты.
В источниках событий события являются неизменяемыми, так что как правильно сделать недействительными и исправить события, представляющие отчеты?
Я думал оДва способа справиться с этим:
Я предоставляю новую пару команд и событий для исправления отчета CorrectPipeConnectedToTankReport
→ PipeConnectedToTankReportCorrected
, а также для аннулирования отчета InvalidatePipeConnectedToTankReport
→ PipeConnectedToTankReportInvalidated
, где эти события будутссылка на исходное событие.
Или я предоставляю новое универсальное событие для аннулирования любого другого события, представляющего отчет: ReportInvalidated
, которое будет ссылаться на рассматриваемое событие.И затем, чтобы исправить отчет CorrectPipeConnectedToTankReport
→ ReportInvalidated
, PipeConnectedToTankReported
и сделать отчет недействительным InvalidatePipeConnectedToTankReport
→ ReportInvalidated
.
Это не похоже на проблему, характерную для моего домена, поэтому япредставьте, что есть правильный способ сделать это.