如何使用CQRS在后端到前端公开业务域模型的只读计算?读取模型与写入模型问题

问题描述 投票:1回答:1

我有两个与CQRS和域驱动设计(DDD)相关的问题。

据我所知,CQRS背后的隔离思想是,有两个单独的模型,一个读模型和一个写模型。只有写入模型才能通过命令访问和使用业务域模型。但是,读取模型通过查询将数据库内容直接转换为DTO,并且根本无法访问业务域。

对于上下文:我正在编写一个Web应用程序后端,该应用程序为粒子物理学提供计算服务。现在我的问题:

1。)我的业务领域逻辑包含一些函数,这些函数从给定的测量系统配置作为输入来计算数学值作为输出。因此,从技术上讲,这些是只读查询,可即时计算值,并且不会更改任何模型中的任何状态。因此,它们应该是读取模型的一部分。但是,由于功能与领域密切相关,因此它们必须是领域模型的一部分,而领域模型又是写入模型的一部分。当应该包含所有查询的读取模型无权访问域模型时,如何通过我的API使这些计算功能可用于前端?

我是否真的必须触发命令以将所有计算保存到数据库,以便读取的模型可以访问计算结果?这些“扔掉”的计算只会在前端短期使用,以后再也没有人需要访问持久的计算结果。测量配置必须是持久的,而不是计算结果。每当用户单击前端上的“计算”按钮时,这些内容将被多次重新计算。

2。)我也觉得我重复了很多数据验证代码,因为读模型和写模型都必须反序列化并验证流程链http request body -> json -> unvalidated DTO -> validated value -> command/query.中相同或非常相似的请求参数。我该如何处理?我可以在读取模型和写入模型之间共享验证代码吗?这似乎消除了隔离。

预先感谢您的所有帮助和想法。

domain-driven-design cqrs business-logic
1个回答
0
投票

我认为您拥有的是一组域服务,它们在给定输入的情况下会返回输出。如您所说,此服务位于域中。但是,没有什么可以拒绝您在读取模型中使用它们的。只要不更改函数内部的域,就可以在域上方的任何层中使用它们。如果由于某种原因该解决方案不可行,例如由于服务需要您无法/不想在查询端构建的域对象,则始终可以将域服务包装在应用程序服务中。在此输入一个基础对象,对域1进行所有转换,调用域服务,然后返回结果值。

对于第二个问题,您可以在域层中将验证服务构建为一组服务或简单功能。同样,没有什么可以拒绝您在验证步骤中使用它们的。我在上一个Web应用程序中做了同样的事情:表单数据的验证步骤调用了一组域服务,当我在处理命令期间构建域对象时,也会使用这些域服务。更改域中的验证同样会影响与Web相关的验证。您验证了两次(在构建命令之前和在构建域对象期间),但是没关系。

看一下端口/适配器或洋葱体系结构:它有助于大量了解层中应保留的内容以及重叠层可以使用的内容。

© www.soinside.com 2019 - 2024. All rights reserved.