CQRS中的验证和错误修正

时间:2010-10-01 15:55:29

标签: cqrs

我得到了CQRS的一般概念,但是当涉及到超越示例代码和幻灯片以处理现实世界问题时,我有一些问题。

  1. 验证

    当您需要对涉及检查数据库中的值的命令进行验证时,您会怎么做? 注册服务,我必须输入一个唯一的电子邮件地址。我听到的一个论点是用户输入重复的电子邮件地址的可能性非常小,所以只需在处理命令时处理它并向他们发送一封“抱歉”的电子邮件,或者建议他们重置密码。因此,该过程避免了为了验证而具有读取模型。但是,如何在命令处理程序中处理重复的情况?你怎么知道那是重复的?检查一个readmodel?你可能首先使用它以获得更好的可用性。

  2. 功能/修复错误的更改

    当您需要更改命令的工作方式或修复错误时会发生什么?在仅附加的哲学中,我如何处理所有旧命令和命令处理程序?我无法将它们重命名为_legacy并隐藏它们,否则我的事件反序列化将无效。有什么优雅的解决方案来解决这个问题?

  3. 由于

1 个答案:

答案 0 :(得分:4)

  1. 请参阅http://codebetter.com/blogs/gregyoung/archive/2010/08/12/eventual-consistency-and-set-validation.aspx和cqrs邮件列表,了解有关此主题的各种讨论。
  2. 在cqrs邮件列表中还讨论了事件版本控制(不需要与事件版本控制相同的命令版本控制)。重放事件以获取聚合的当前状态,而不是命令。这样您的功能就可以发展。没有办法改变过去,但有办法改变现在/未来。在奇怪的情况下,您必须以不同的方式开始跟踪状态,提供显式命令。对于事件的新属性,只需提供默认值,就像对新数据库列一样。如果这些新值基于已存在的状态,则建模显式命令以预先计算它们。优点是您可以异步执行此操作,而数据库升级也会强制您更改代码。在cqrs邮件列表上更好地询问如何工作。 一个警告 !不要过于轻松地采取事件采购。你可以只使用CQRS。我认为人们在CQRS大部分时间都会切换到CQRS + ES。
  3. 然后转到groups.google.com/group/dddcqrs并获取帮助。另一个有用的资源是cqrsinfo.com