gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:39:12 24 4
gpt4 key购买 nike

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

据我了解 CQRS 背后的隔离思想,人们会有两个独立的模型,一个读取模型和一个写入模型。只有写入模型才能通过命令访问和使用业务领域模型。而读模型直接通过查询的方式将数据库内容转化为DTO,根本无法访问业务域。

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

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

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

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

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

最佳答案

我认为您所拥有的是一组域服务,它们通过给定的输入返回一个输出。如您所说,此服务位于域中。但是,没有什么可以阻止您在读取模型中使用它们。只要不更改函数内部的域,就可以在域之上的任何层中使用它们。如果出于任何原因,此解决方案不可行,因为例如服务需要您不能/不想在查询端构建的域对象,您始终可以将域服务包装在应用程序服务中。在那里输入一个基础对象,对域对象进行所有转换,调用域服务并返回结果值。

对于第二个问题,你可以在领域层构建一个验证服务,作为一组服务或简单的功能。同样,没有什么可以阻止您在验证步骤中使用它们。我在我的最后一个网络应用程序中做了同样的事情:表单数据的验证步骤调用了一组域服务,当我在处理命令期间构建域对象时也会使用这些服务。更改域中的验证具有 Web 相关验证更改的效果。您验证了两次(在构建命令之前和在构建域对象期间),但没问题。

看看端口/适配器或洋葱架构:它有助于理解层内应该保留什么以及重叠层可以使用什么。

关于domain-driven-design - 如何使用 CQRS 将后端业务领域模型的只读计算公开到前端?读取模型与写入模型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60334923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com