CQRS 命令和域状态

Posted

技术标签:

【中文标题】CQRS 命令和域状态【英文标题】:CQRS Command and domain state 【发布时间】:2010-09-29 22:59:09 【问题描述】:

我是 CQRS 的新手,对命令如何将地址更改写入客户对象感到困惑

假设我已将客户信息分为两个表

客户 - 域数据库

主动 首选

Customer_Read 数据库

姓名,

地址,

电话,

电子邮件

用户修改了客户的地址。地址字段都在读取数据库中。 可能有 3 个或更多查询友好的表来保存地址信息。

如果我了解 CQRS 实现(示例)客户域(已删除聚合根)应该发布有关地址更改的事件,该事件应该由多个处理程序处理以更新每个表。

当我不改变客户对象的状态时,如何实现这一点? 域是否必须知道它在另一个数据库中有地址?

提前谢谢你。

问候,

三月

更新--

在网上浏览了更多帖子后,我假设如果命令未更改状态,则不会生成任何事件来保存域本身,但将应用事件来更改查询/视图模型中的地址友好的桌子。

【问题讨论】:

【参考方案1】:

你仍然需要在写持久化的某个地方持久化一些域数据。这样地址就存储在这个持久化存储中,事件改变后发布。

这边:

如果没有变化 - 我们可以跳过发布活动 domain 不需要知道关于可能(或可能不)订阅他的事件的对象的任何信息。

此逻辑适用于关系数据库中的持久性(例如带有 NHibernate 的 MS SQL)和事件溯源方法。

【讨论】:

您的回答对我来说确实有意义。我想看到的是(并且在阅读和观看 Udi 的观点之后),如果我可以删除非易失性属性以读取侧。如果我不理解您的回复 -ChangeAdressCommand,将首先将更改持久化到写入端,然后发布事件(可以由读取端处理程序订阅)。顺便提一句。我喜欢阅读您的博客和 Lokad 概念。您对 NCQRS 有何看法? 是的,您可以将不那么易失(或只是不太重要)的信息直接移动到读取端(只要写入端不需要它来做出决定)。 Re Udi 的方法 - 一开始我很喜欢,但现在我更倾向于 Greg 的想法(他不像 Udi 那样是顾问,因此不偏向某些技术)。重新 NCQRS - 它不适合我的方法。

以上是关于CQRS 命令和域状态的主要内容,如果未能解决你的问题,请参考以下文章

ABP CQRS 实现案例:基于 MediatR 实现

CQRS 和 EF 数据模型

3.16 Go微服务实战(微服务理论) --- Go语言基于ES-CQRS的微服务实践

3.16 Go微服务实战(微服务理论) --- Go语言基于ES-CQRS的微服务实践

CQRS 命令/查询装饰器

命令查询职责分离模式CQRS