代码之家  ›  专栏  ›  技术社区  ›  JontyMC

CQRS中的域查询

  •  24
  • JontyMC  · 技术社区  · 15 年前

    我们正在尝试 CQRS . 我们有一个验证场景,其中CustomerService(域服务)需要知道客户是否存在。客户的电子邮件地址是独一无二的。我们的客户存储库(通用存储库)只有Get(id)和Add(Customer)。CustomerService应该如何发现客户是否存在?

    4 回复  |  直到 15 年前
        1
  •  26
  •   user247702    8 年前

    请看这篇博文: Set based validation in the CQRS Architecture .

    它解决了这个问题。在CQR中,这是一个复杂的问题。Bjarte建议查询报告数据库中现有的客户电子邮件地址,并发出一个补偿命令(例如 CustomerEmailAddressIsNotUniqueCompensatingCommand )如果找到电子邮件地址,则返回到域模型。然后可以触发适当的事件,其中可能包括 UndoCustomerCreationEvent .

    Adam D. 在评论中指出验证是一个领域问题。因此,您可以将ReservedMailAddress存储在一个服务中,该服务有助于创建客户,并由事件存储中的事件来补充。

        2
  •  5
  •   Mark Lindell    14 年前

    这个问题不必那么复杂:

    1. 在提交UpdateCustomer命令之前,请检查报告存储区中的客户唯一性。
    2. 为您的DB添加电子邮件地址唯一性约束。执行命令时,处理异常并使用回复通道向用户发送通知(hences从不向报告存储触发自定义更新事件。

    使用数据库做它的好处,不要被ORM的限制所困扰。

        3
  •  5
  •   t0PPy    14 年前

    http://www.udidahan.com/2009/12/09/clarified-cqrs/

    “此外,我们不需要访问查询存储来处理命令。任何需要的状态都应该由自治组件管理,这是自治的一部分。”

    但是,如果您不想这样做,根据上面的陈述,我建议您将“ByEmail”方法添加到存储库中,然后使用它完成—但是,Udi可能会有更好的建议。。

        4
  •  2
  •   Abhay Naik    11 年前

    因此,在本例中,我们可以有一个名为CustomerMailMustBeUniquerule的类,它是在RegisterCustomerCommandExecutor即将执行命令“RegisterCustomerCommand”时由规则引擎获取的。此规则类负责查询数据库以查找电子邮件id是否存在,并通过提升无效标志停止执行。。。