Domain driven design CQRS中的域查询

Domain driven design CQRS中的域查询,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我们正在尝试。我们有一个验证场景,其中CustomerService(域服务)需要知道客户是否存在。客户的电子邮件地址是独一无二的。我们的客户存储库(通用存储库)只有Get(id)和Add(Customer)。CustomerService应该如何发现该客户是否存在?看看这篇博文: 它解决了这个问题。在CQR中,这是一个复杂的问题。Bjarte建议查询报告数据库中现有的客户电子邮件地址,并在找到电子邮件地址时向域模型发出补偿命令(如customeremailaddressisnotuniquec

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

看看这篇博文:

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

通读上述博客帖子上的评论,寻找其他想法

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

我不确定有没有一个简单的解决办法,这个问题,觉得完全干净。让我知道你想到了什么


祝你好运

这个问题不必那么复杂:

  • 在提交UpdateCustomer命令之前,请检查报告存储区中的客户唯一性
  • 为您的DB添加电子邮件地址唯一性约束。执行命令时,处理异常并使用回复通道向用户发送通知。(hences从不向报告存储触发自定义更新事件
  • 使用数据库做它的好处,不要被ORM限制所困扰。

    Udi Dahan的这篇文章包含以下段落:

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

    我相信Udi建议只向数据库添加一个唯一的约束


    但是如果你不想这样做,根据上面的陈述,我建议只添加“通过电子邮件”方法添加到存储库中,并使用它完成操作-但是Udi可能会有更好的建议。

    希望我不会太晚…但是我们在项目中遇到了类似的情况,我们实际上截取了命令执行器,并将其与为该命令创建的一组规则一起附加,该规则反过来使用查询来获取数据


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

    如另一个答案中所述,您不应在处理命令时对视图模型执行查询。如果有的话,这些在发送命令之前,客户端应该执行查询,并根据结果选择不发送命令。@Udi Dahan我不知道从SOA的角度来看这个用户名示例是如何工作的。当我收到CreateNewUserCommand时,我当然需要检查用户名是否不存在?我不能假设客户端已经完成了这一检查,特别是如果客户端可以是第三方应用程序?我理解在处理命令时不执行查询的基本原理,但是我可以想到一些处理命令时需要分析命令的集合之外的数据(第三PAR)的方法。ty应用程序将通过一个行为良好的“客户端”进行连接,该客户端可能是一个web服务,它将根据视图模型进行检查,如果检查通过,则将单向消息发送到“服务器”。作为David评论的基础,SOA的全部要点是支持集成和扩展等。因此,最基本的规则之一是永远不要信任。因此,我们应该在提交之前进行验证。@inf3rno或当您的投影或事件总线卡住时进行验证。@inf3rno。想象一下周末的这种情况,一个执行重复执行
    CreateNewUserCommand
    ,最终为同一个用户聚合了100多个用户。这确实是一个巨大的失败点,似乎没有人知道如何正确解决。(我也不知道,否则谷歌不会把我带到这里:p)如果不是数据库呢并发命令呢?在某些(罕见但可能的)情况下可以创建两个客户。但这并不适用于所有情况,例如,我使用的NoSQL数据库不支持“约束”的概念。@james什么NoSQL数据库?