【问题标题】:CQRS/ES denormalizersCQRS/ES 非规范化器
【发布时间】:2015-08-05 06:10:28
【问题描述】:

我正在开发一个使用事件溯源和 CQRS 的发票 Web 应用程序。

我有 2 个用于不同查询的反规范化器(一个用于发票摘要列表,一个用于包含完整详细信息的单个发票)。我觉得很奇怪,我需要为这 2 个非规范化器复制大量逻辑 - 例如,监听改变总计、小计、税收等的事件。

我最终在消息总线上传递了包含真实计算数据的聚合本身,而不仅仅是事件,并且让非规范化器而不是事件来监听它。

这对我来说更简单,但似乎与模式不同。我读过的任何文章都没有提到这种方法。

我喜欢只在总线上传递事件并让每个非规范化器对其需要做出反应的想法,但在实践中感觉更麻烦。

我很想听听你的想法。

感谢您的帮助!

【问题讨论】:

  • “复制很多逻辑”:究竟是什么逻辑?能举个例子吗?
  • @guillaume31 当然,例如 - 用户在发票上加税。我有一个事件 TaxAdded(rate: Double),它会更改发票总额。我想通过将税额添加到发票总额来更新摘要和详细视图。通过传递聚合本身,我可以简单地进行一次计算(在聚合中),并根据该计算更新两个视图
  • 您也可以简单地在汇总中进行一次计算,并且只包括随事件发生变化的数据(例如,新的总数而不是税率)。无需传递整个聚合。
  • 这对我来说似乎有点尴尬,因为系统中实际发生的事件是税率变化。如果明天我想更改总计算背后的逻辑,我仍然会在事件存储中使用旧逻辑保存事件。总数应该来自聚合的当前状态,我无法完全预测将来会发生哪些相关事件。希望我能说清楚:) 感谢您的帮助
  • 我想你说得有道理。我可能应该添加一个带有计算(小计、总计、税收等)字段的事件,并在发生影响这些计算的其他事件时发布它

标签: domain-driven-design cqrs event-sourcing system-design


【解决方案1】:

正如上面评论中的 guillaume31 所建议的,您可以简单地使用特殊事件来丰富您的域模型,例如 NewTotalComputed。但是,根据事件的数量,这可能很快就会使您的域模型变得混乱。

或者,您可以将计算逻辑重构为一个特殊的策略类,用于域模型(聚合根)和读取模型。

【讨论】:

  • 是的。但我并不一定是在暗示一个新事件。您可以保留TaxAdded,这是 IMO 更能揭示意图,并发送 NewTotal 而不是/除了 TaxRate 之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2016-05-13
  • 2018-06-06
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多