CQRS验证和唯一性

问题描述

| 在我的CQRS体系结构中,我想验证当我发送InsertSettingCommand(设置是键/值对象)时,我想检查该键在数据库中是否不存在。如果我对CQRS和验证的理解很好,它表示仅在验证某些格式设置(例如检查电子邮件是否符合某种语法或客户的名字不为空)时才应在客户端执行验证。但就我而言,我需要查询数据库以查看其是否存在,但是我不知道在客户端查询我的读取存储是否正确?还是应该在我的域侧调用我的读取存储区?然后抛出一个InsertSettingDuplicated事件? 那么,在CQRS环境中适合我的情况的最佳方法是什么?有人在谈论补偿行为吗?有什么可以帮助我的吗? 谢谢。     

解决方法

如果您需要修复一些错误的命令而导致读/写存储中断,请使用“补偿动作”。 无疑,在发送命令之前使用读取存储来验证某些内容是毫无疑问的,以便发送有效命令。     ,可以从客户端进行查询以读取存储以验证唯一性。这是格雷格·杨(Greg Young)关于使用CQRS进行基于集合的验证的一些想法。     ,从理论上讲,您甚至不需要检查重复的密钥,客户端应自行连接以完全从用户输入中分割出此类信息。例如:在下拉列表中有此类项目的列表,或任何其他选择性列表。 补偿性动作或补偿性命令仅应在系统无法执行过程时使用,因此必须回滚一些命令或它在构建到故障点之前所做的任何事情。 例如,假设系统必须插入一个设置,此命令应能够引发的唯一事件应该是\'SettingInsertedEvent \'之类的事件。因此,假设未引发此事件,我们可以指示系统对此进行补偿,并回滚它在该过程中所做的所有操作。 您的命令还可以实现一个接口,该接口通过dataManager为您执行检查。或者,您可以只构建没有键的dataModel,并使表自动递增,因此您甚至不必完全担心这种情况。 (我确定现在您已经知道dataModel只是数据库服务器中现有表的代码表示,并通过ORM(任何现代应用程序的另一个基本部分)链接到该表。)