在 CQRS 中,我们将命令和查询分开。据我了解,命令引发可能修改实体状态的域事件,而查询直接从数据存储返回查看特定 DTO。根据这篇文章,用户界面通过命令总线发出命令,命令总线创建由各自的命令处理程序处理的命令,然后协调域逻辑以确定域事件的发生并将任何状态更改保持/发布到存储库(可选地使用事件采购)。持久化后,状态更改可通过查询获得。
现在,如果一个命令创建一个没有立即持久化/发布的实体怎么办?首先,那个尚未持久化的实体在哪里?它是在命令总线、命令处理程序、存储库中,还是应该由一个新的瘦应用层来持有?Query 应该如何访问它?
这里的问题是,对于非持久化实体的任何查询似乎都与持久化实体的查询有很大不同,除非 CQRS 要求所有实体在创建时都被持久化,这 IMO 不一定与所有域兼容。
具体来说,我正在尝试构建软件来记录各种培训课程的培训信息。但是,如果培训课程是通过保存课程按钮手动保存而不是总是在创建时保存,我希望它。我不知道 StartNewTrainingSessionCommand 将在哪里存储新的培训课程,以便可以查询它,如果不在数据存储中的话。