CQRSvalidation和唯一性

在我的CQRS架构中,我想validation当我发送一个InsertSettingCommand(设置是一个键/值对象)时,我想检查我的数据库中是否存在该键。 如果我理解CQRS和validation,它说只有在validation某些格式化内容时才会在客户端执行validation,例如检查电子邮件是否遵循某种语法或客户的名称是否为空。 但在我的情况下,我需要查询我的数据库,看它是否存在,但我不知道在客户端查询我的读取存储是否正确? 或者我应该在我的域名中调用我的阅读商店? 然后抛出一个InsertSettingDuplicated事件?

那么在CQRS环境中我最好的方法是什么呢? 有人谈论补偿行动吗? 它能帮助我吗?

谢谢。

  1. 如果您需要修复一些破坏读/写存储的错误命令,请使用“补偿操作”。
  2. 在发送命令之前使用Read存储来validation某些内容是正确的,以便发送有效命令,毫无疑问。

可以从客户端进行查询以读取存储空间以validation唯一性。 以下是 Greg Young关于使用CQRS进行基于集合validation的一些想法。

从理论上讲,你甚至不需要检查一个重复的密钥,你的客户端应该连接起来自己检索这些信息,完全从用户输入中分割出来。 例如:在下拉列表中包含此类项目的列表,或任何其他选择性列表。

补偿操作或补偿命令只应在系统执行过程失败时使用 ,因此必须回滚一些命令或在构建到故障点时所执行的任何操作。

例如,假设系统必须插入一个设置,此命令应该能够引发的唯一事件应该是’SettingInsertedEvent’。 因此,假设没有引发此事件,我们可以指示系统对此进行补偿,并回滚它在该过程中所做的任何事情。

您的命令还可以实现一个通过dataManager进行检查的接口。 或者你可以在没有键的情况下构建一个dataModel,并使表自动增加,这样你甚至不必完全担心这个场景。 ( 我确定你现在知道dataModel只是数据库服务器中现有表的代码表示,由ORM链接到它,是任何现代应用程序的另一个基本部分。