1

在 CQRS 中,我们将命令和查询分开。据我了解,命令引发可能修改实体状态的域事件,而查询直接从数据存储返回查看特定 DTO。根据这篇文章,用户界面通过命令总线发出命令,命令总线创建由各自的命令处理程序处理的命令,然后协调域逻辑以确定域事件的发生并将任何状态更改保持/发布到存储库(可选地使用事件采购)。持久化后,状态更改可通过查询获得。

现在,如果一个命令创建一个没有立即持久化/发布的实体怎么办?首先,那个尚未持久化的实体在哪里?它是在命令总线、命令处理程序、存储库中,还是应该由一个新的瘦应用层来持有?Query 应该如何访问它?

这里的问题是,对于非持久化实体的任何查询似乎都与持久化实体的查询有很大不同,除非 CQRS 要求所有实体在创建时都被持久化,这 IMO 不一定与所有域兼容。

具体来说,我正在尝试构建软件来记录各种培训课程的培训信息。但是,如果培训课程是通过保存课程按钮手动保存而不是总是在创建时保存,我希望它。我不知道 StartNewTrainingSessionCommand 将在哪里存储新的培训课程,以便可以查询它,如果不在数据存储中的话。

4

1 回答 1

1

我认为您的理解有些错误:命令通过服务总线发送到命令处理程序,该处理程序使用业务对象来完成工作。域事件应该由业务(域)对象生成,但有时命令处理程序也会这样做。

我看不到不保存已创建实体的原因。在您的特定情况下,如果域允许,您可以自动保存默认的空 TrainingSession,然后在用户按下 Save 按钮时更新。

如果这种方法不可行,那么只需将输入数据(几乎是视图模型)存储在临时位置(会话、数据库)并仅在用户单击按钮时发出命令。

于 2013-10-14T07:25:03.553 回答