在CQRS中,我们将命令和查询分开。据我了解,命令引发可以修改实体状态的域事件,而查询直接从数据存储返回View特定DTO。根据{{3}},UI通过命令总线发出命令,命令总线创建由各自的CommandHandler处理的命令,然后CommandHandler编排域逻辑以确定域事件的发生并将任何状态更改持久/发布到存储库(可选地使用Event Sourcing)。持久化后,可以通过查询获得状态更改。
现在,如果命令创建未立即保留/发布的实体,该怎么办?首先,尚未持有的实体在哪里举行?它是在命令总线,命令处理程序,存储库中,还是应该有一个新的瘦应用程序层?查询应如何获得对它的访问权限?
这里的问题是,对于未加载实体的任何查询似乎与持久实体的查询显着不同,除非CQRS要求在创建时保持 ALL 实体,IMO不一定与所有实体兼容域。
具体来说,我正在尝试构建软件来记录各种培训课程的培训信息。但是,如果培训会话通过“保存会话”按钮手动保留而不是始终在创建时保留,我希望如此。我不知道StartNewTrainingSessionCommand会在哪里存储新的Training Session,以便可以查询它,如果不在数据存储中的话。
答案 0 :(得分:1)
我认为你理解的事情有点不对:命令通过服务总线发送到命令处理程序,命令处理程序使用业务对象来完成工作。域事件应该由业务(域)对象生成,但有时命令处理程序也会这样做。
我没有看到创建实体不被保存的原因。在您的特定情况下,如果域允许,您可以自动保存默认的空TrainingSession,然后在用户按“保存”按钮时更新。
如果这种方法不可行,那么只需将输入数据,几乎是视图模型存储在临时位置(session,db)中,并仅在用户单击按钮时发出命令。