Domain driven design 指挥还是不指挥,这是个问题

Domain driven design 指挥还是不指挥,这是个问题,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我对CQRS还不熟悉,但我能看到其中的价值,所以我尝试将其应用到我们正忙于重建的金融系统中 正如我提到的,这是一个基本的fin系统,具有基本的余额、取款、存款等功能 我有取款和存款命令。但我正在努力平衡 根据领域专家的说法,他们希望将余额作为一项交易来处理,而不涉及任何财务问题(目前),代表客户。因此,当客户端通过设备执行余额inq时,它会创建一个事务,但同时也会创建一个余额查询 在CQRS世界中,您可以区分改变状态的命令和以某种方式检索数据的查询 如果我的理解有缺陷,我道歉。有人能给我指出正确

我对CQRS还不熟悉,但我能看到其中的价值,所以我尝试将其应用到我们正忙于重建的金融系统中

正如我提到的,这是一个基本的fin系统,具有基本的余额、取款、存款等功能

我有取款和存款命令。但我正在努力平衡

根据领域专家的说法,他们希望将余额作为一项交易来处理,而不涉及任何财务问题(目前),代表客户。因此,当客户端通过设备执行余额inq时,它会创建一个事务,但同时也会创建一个余额查询

在CQRS世界中,您可以区分改变状态的命令和以某种方式检索数据的查询

如果我的理解有缺陷,我道歉。有人能给我指出正确的方向吗

编辑: 也许让我这么说吧。我正在考虑创建一个CheckBalanceCommand来创建一个事务&在存储中插入一个BalanceCheckedEvent。但是我还需要创建一个CheckBalanceQuery来从readdb中检索实际余额。
为了满足余额请求,我需要调用这两个函数。

这是一个有趣的问题。您的业务案例是有效的:某些命令不会改变聚合/实体状态,仍然会处理它们,并且它们的结果事件很重要(例如,对于审计跟踪)

为了支持这些情况,我将引入一个名为
IdentityEvent
的基本事件类型(灵感来源于各种数学运算符的标识值,并作为概念的理由;在特定值上操作它们不会改变它)。发出相应命令时,此事件的派生(例如,在您的情况下,
BalanceCheckedEvent
)将附加到聚合的事件流中,并且视图投影可以像往常一样从它们构造视图;然而,他们的变异方法在从事件流重建实体时不会执行任何实际的变异


实际的命令处理在域层进行。应用程序层的一些应用程序服务接收查询请求,并像往常一样进行处理。此外,在查询操作之前或之后,相同的应用程序服务可能会在聚合根本身上向域层发出命令。这并不违反任何原则:您的读取和查询模型仍然是分开的,应用程序服务只是在两者之间进行协调。

这是一个有趣的问题。您的业务案例是有效的:某些命令不会改变聚合/实体状态,仍然会处理它们,并且它们的结果事件很重要(例如,对于审计跟踪)

为了支持这些情况,我将引入一个名为
IdentityEvent
的基本事件类型(灵感来源于各种数学运算符的标识值,并作为概念的理由;在特定值上操作它们不会改变它)。发出相应命令时,此事件的派生(例如,在您的情况下,
BalanceCheckedEvent
)将附加到聚合的事件流中,并且视图投影可以像往常一样从它们构造视图;然而,他们的变异方法在从事件流重建实体时不会执行任何实际的变异


实际的命令处理在域层进行。应用程序层的一些应用程序服务接收查询请求,并像往常一样进行处理。此外,在查询操作之前或之后,相同的应用程序服务可能会在聚合根本身上向域层发出命令。这并不违反任何原则:您的读取和查询模型仍然是分开的,应用程序服务只是在两者之间进行协调。

这并不像您想象的那样罕见。另一个有效的商业案例是服务提供商对某人进行信用检查。信用报告公司实际上存储了针对信用评分的查询,并使用它来影响未来的信用评分。当然,当我说这并不像我们想象的那么罕见时,我并不是在试图规范这些实践(我们应该回过头来理解这样的东西为我们的产品提供的真正价值)

我的建议是明确地对此进行建模,而不是试图将其概括。此功能可能是由某些业务需求驱动的,因此您应该对其进行建模。我的意思是,您应该将为读取服务的服务完全视为一个单独的服务,它可以为发生的事情引发自己的事件,并以反应式方式设计系统的其余部分(即响应另一个BC/服务生成的事件)

例如,您可以让服务查询的服务触发BalanceChecked事件,该事件可以由同一服务或另一服务存储在流中以供后续处理


我不建议使用命令,因为如果您使用数据进行回复,并不是说有人可以拒绝该命令;这已经发生了,有人已经掌握了数据。

这并不像你想象的那么罕见。另一个有效的商业案例是服务提供商对某人进行信用检查。信用报告公司实际上存储了针对信用评分的查询,并使用它来影响未来的信用评分。当然,当我说这并不像我们想象的那么罕见时,我并不是在试图规范这些实践(我们应该回过头来理解这样的东西为我们的产品提供的真正价值)

我的建议是明确地对此进行建模,而不是试图将其概括。此功能可能是由某些业务需求驱动的,因此您应该对其进行建模。我的意思是,您应该将为读取服务的服务完全视为一个单独的服务,它可以为发生的事情引发自己的事件,并以反应式方式设计系统的其余部分(即响应另一个BC/服务生成的事件)