我们正在尝试 连续QRS. 。我们有一个验证情况,其中 CustomerService(域服务)需要知道客户是否存在。客户的电子邮件地址是独一无二的。我们的客户存储库(通用存储库)只有 Get(id) 和 Add(customer)。CustomerService 应如何确定客户是否存在?

有帮助吗?

解决方案

看看这个博客帖子:的在CQRS架构设定基于验证。

这解决了这个问题非常。这是一个复杂的问题,以应对CQRS。什么比阿特被暗示是查询现有客户的电子邮件地址的报告数据库,并发出补偿命令(如CustomerEmailAddressIsNotUniqueCompensatingCommand)回领域模型如果一个电子邮件地址被发现。然后,可以断火相应的事件,其可以包括一个UndoCustomerCreationEvent

通读上述博客帖子替代想法的评论。

亚当D.在注释该验证是域关注暗示。其结果是,你可以存储在ReservedEmailAddresses有利于客户创造,并通过在事件店内活动水合服务。

我不知道有一个简单的解决这个问题,感觉完全干净。让我知道你想出的!

祝你好运!

其他提示

这个问题不必那么复杂:

  1. 在提交 UpdateCustomer 命令之前,请检查您的报告存储中的客户唯一性。
  2. 向数据库添加约束以确保电子邮件地址的唯一性。执行命令时,处理异常并使用回复通道向用户发送通知。(因此永远不会向报告存储触发 CustomerUpdated 事件。

充分利用数据库的用途,不要被 ORM 限制所束缚。

此发布者乌迪大汉 http://www.udidahan.com/一十二分之二千零九/ 09 /澄清-CQRS / 包含以下内容:

“此外,我们不应该需要访问查询储存处理命令 - 这是需要应该由独立的组件来管理的任何状态 - 这就是自主意义的一部分”

我相信乌迪提示简单地增加一个唯一约束到数据库。

但是,如果你不喜欢这样做,基于上面的说法,我建议只是增加了“ByEmail”法库,并用它做 - 不过话又说回来了乌迪将可能有更好的建议。

希望我不是太晚了......但我们在我们的项目中遇到类似的情况,我们实际上拦截命令执行,并与该命令,又使用查询来获取创建的一套规则,将其固定数据

因此,在这种情况下,我们可以通过名称,CustomerEmailMustBeUniqueRule其是由RuleEngine取当命令“RegisterCustomerCommand”即将由RegisterCustomerCommandExecutor执行有一个类。此规则类有责任来查询数据库中查找,如果电子邮件ID存在,并通过提高无效标志停止执行...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top