7

在我的 CQRS 架构中,我想验证当我发送一个 InsertSettingCommand(设置是一个键/值对象)时,我想检查我的数据库中是否不存在该键。如果我很好地理解 CQRS 和验证,它表示只有在验证某些格式化内容(例如检查电子邮件是否遵守某些语法或客户姓名不为空)时才应在客户端执行验证。但就我而言,我需要查询我的数据库以查看它是否存在,但我不知道在客户端查询我的读取存储是否正确?或者我应该在我的域端调用我的读取存储?然后抛出一个 InsertSettingDuplicated 事件?

那么在我的 CQRS 环境中,最好的方法是什么?有人说补偿措施?它可以帮助我吗?

谢谢。

4

3 回答 3

9

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

于 2011-05-26T15:05:04.793 回答
3
  1. 如果您需要修复一些破坏您的读/写存储的错误命令,请使用“补偿操作”。
  2. 在发送命令之前使用读取存储来验证某些东西是正确的,以便发送有效的命令,毫无疑问。
于 2011-06-16T21:44:57.463 回答
1

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

补偿动作或补偿命令只应在系统未能执行某个过程时使用,因此必须回滚一些命令或它在构建过程中所做的任何事情到故障点。

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

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

于 2017-07-11T07:59:15.023 回答