CQRS验证&独特性

时间:2011-05-26 14:51:42

标签: c# validation cqrs

在我的CQRS架构中,我想验证当我发送一个InsertSettingCommand(设置是一个键/值对象)时,我想检查我的数据库中是否存在该键。如果我了解CQRS&验证很好,它说验证应该只在客户端进行验证,而不是验证一些格式化的东西,如检查电子邮件是否尊重某些语法或客户的名称是否为空。但在我的情况下,我需要查询我的数据库以查看它是否存在,但我不知道在客户端查询我的读取存储是否正确?或者我应该在我的域名中调用我的阅读商店?然后抛出一个InsertSettingDuplicated事件?

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

感谢。

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

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

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