【问题标题】:CQRS Validation & uniquenessCQRS 验证和唯一性
【发布时间】:2011-05-26 14:51:42
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: c# validation cqrs


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      1. 如果您需要修复一些破坏您的读/写存储的错误命令,请使用“补偿操作”。
      2. 在发送命令之前使用读取存储来验证某些内容是正确的,为了发送有效的命令,毫无疑问。

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-03-16
          • 2012-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多