如何使用事件源实现复杂表单的命令和事件?

Woj*_*arz 5 domain-driven-design event-sourcing axon

我想使用 Axon 框架实现 CQRS 和 ES

我有一个相当复杂的 HTML 表单,它表示招聘过程的六个步骤。
ES 将有助于生成选定日期的历史统计数据并跟踪表单的变化。

管理员始终可以执行多项操作:

  • 指定专人负责每个步骤
  • 为每个步骤提供注释
  • 每一步接受或拒绝候选人
  • 打开/关闭短信或电子邮件通知
  • 分配标签

表单更新(仅差异)从 UI 应用程序发送到后端。

假设我只想对服务器端应用程序进行更改,问题是什么应该是命令,什么应该是事件,我考虑三个选项:


  1. 表单补丁是一个命令,它生成Form Update Event

    • 此解决方案的缺点是每个事件处理程序都需要检查表单中的更改是否引用此处理程序 ex。是否应该发送有关拒绝的电子邮件

  1. 表单补丁是一个命令,它生成多个事件,例如:。Interviewer Assigned, Notifications Turned Off,Rejected on technical interview

    • 该解决方案的缺点是,可能会生成一些事件,而其他事件则不会,因为违反了约束,例如:Notifications Turned Off会成功,但Interviewer Assigned由于分配未经授权的用户而失败。也许我应该在命令生成之前检查所有约束?

  1. 表单 patch 被转换为多个命令 ex: Assign InterviewerTurn Off Notifications每个命令都会生成事件 ex:Interviewer Assigned, Notifications Turned Off

    • 此解决方案的缺点是某些命令可能会失败,例如:Assign Interviewer可能由于分配未经授权的用户而失败。这最终会导致状态不一致,因为有些事件将存储在存储库中,有些则不会。也许我应该在命令生成之前检查所有约束?

Voi*_*son 4

我想提请您注意的问题是:您是否为您存储的信息创建权威,或者您只是跟踪来自外部世界的信息?

\n\n

Udi Dahan 写了竞争条件不存在;提出这个有趣的观点

\n\n
\n

时间上的微秒差异不应\xe2\x80\x99 对核心业务行为产生影响。

\n
\n\n

如果您的系统中有未经授权的用户,那么在为他们分配特定步骤的责任之前对其进行授权对业务来说真的很重要吗?系统真的能判断出“错误”是责任被分配给了错误的用户,而不是用户被错误地未授权吗?

\n\n

Greg Young 谈论了仓库系统中的异常报告,指出在这种情况下模型的责任不是阻止数据更改,而是在数据更改产生不一致状态时进行报告。

\n\n

如果您仍然更新数据,企业的成本是多少?

\n\n

如果消息的语义是 aDecision Has Been Made或 that Something In The Real World Has Changed,那么您的模型不应尝试阻止记录该信息。

\n\n

FormUpdated由于您提到的原因,这不是特别令人满意的事件;您必须做大量额外的工作才能将其转换为特定领域的术语。如果有选择的话,您宁愿这样做一次。在进行过程中,考虑将事件从领域不可知的形式转换为领域特定的形式是合理的。

\n\n
HttpRequestReceived ->\nFormSubmitted ->\nInterviewerAssigned\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中中间表示是短暂的。

\n