CQRS 验证和唯一性

8
在我的CQRS架构中,当我发送InsertSettingCommand(设置是一个键/值对象)时,我希望验证该键在我的数据库中不存在。如果我正确理解了CQRS和验证,它表示验证应仅在客户端执行,仅用于验证某些格式方面的内容,例如检查电子邮件是否符合某些语法规则或客户姓名不为空。但在我的情况下,我需要查询我的数据库以查看它是否存在,但我不知道在客户端中查询我的读取存储是否正确?还是应该在我的领域端调用我的读取存储?然后引发InsertSettingDuplicated事件?
那么,在CQRS环境中,对于我的情况,应采取什么最佳方法?有些人谈论补偿措施?这是可以帮助我的东西吗?
谢谢。
3个回答

10

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


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

2
在理论上,你甚至不需要检查重复关键字,你的客户端应该被连接以便自行检索此类信息,完全与用户输入隔离。例如:在下拉列表或其他选择性列表中有这些项目的清单。
只有当系统无法执行过程并且必须回滚一些命令或操作时,才应使用补偿性操作或补偿性命令。
例如,假设系统必须插入一个设置,这个命令应该引发的唯一事件应该是“SettingInsertedEvent”。那么假设这个事件没有被引发,我们可以指示系统进行补偿,并回滚它在该过程中所做的任何操作。
你的命令也可以实现一个接口,通过数据管理器为你检查。或者你可以构建一个没有关键字的数据模型,并使表格自动递增,这样你就不用担心整个场景。 (我敢肯定你现在已经知道数据模型只是你的数据库服务器中现有表格的代码表示,通过ORM与之链接,是任何现代应用程序的另一个基本部分。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接