DDD:DTO组装器应该是领域层的一部分吗?

5
感谢您的提前预约。
我在领域层库中有一些聚合物,还有一些DTO存储在一个独立的库中,该库在服务器和客户端之间共享。
实体的聚合比其DTO更具信息量。因此,为了从DTO转换为聚合,应该由DTO Assembler访问存储库。存储库的接口位于Domain Layer中。这就是我得出结论:DtoAssembler应该是DomainLayer的一部分。
这样说对吗?

感谢您的回答。我仍在努力将所有内容整合起来。我稍微编辑了一下我的问题。我的意思是DtoAssembler决定了存储库应该具有哪些方法。而存储库的接口在DL中。这就是为什么我开始考虑DtoAssembler是DL的一部分的原因... - Andrey K.
1
我的错误在于我想使用_DtoAssembler_将_Dto_转换为_Aggregate_。感谢答案,我知道最好在_Application Services_中进行转换和应用。 - Andrey K.
2个回答

9

在DDD的背景下,这是绝对错误的。

试着问一个(非技术)领域专家对DTO组装器的看法。他会用大而疑惑的眼神看着你。

DTO(以及其组装器)是一个技术概念 - 它们定义了在系统特定接口上下文中的数据结构。

存储库通常返回聚合。如果您查询数据库以获取未在您的领域中建模的统计数据,则存储库也可以返回不可变数据对象。只需确保在这样做时不会意外地漏掉领域概念即可。

一旦您从存储库中获取了数据(无论它是聚合还是数据对象),就可以将其馈送到DTO组装器中。


谢谢!DtoAssembler需要一个IRepository来将Dto转换为Aggregate,对吗?我想问一下,DtoAssembler应该是“聪明”的,不仅要获取Aggregate,还要对其进行更改,对吗?(这是因为Dto中的数据可能与检索到的Aggregate的数据不同,而Id相同...)...? - Andrey K.
我会让 DtoAssembler 保持简单,在应用服务中处理所有非常规的操作。这样,DtoAssembler 只需要获取构建 DTO 所需的输入,必要时进行转换(例如序列化),然后返回 DTO。 - theDmi
谢谢,我喜欢这个想法 :) 那么另一种方式呢,从 Dto 到 Aggregate 的转换怎么样?我可能有一个误导性的想法,认为 DtoAssembler 也应该能够从 Dto 转换到 Aggregate... - Andrey K.
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - theDmi

2
在我看来,并不一定如此。由于您正在使用分层架构,我假设您的DTO位于上层 - 通常是服务层 - 它作为服务器和客户端之间的通信点。确实,DTO的主要目的就像它们的名字所暗示的那样(数据传输对象),是为了使通信更加便捷,传输信息而不附加任何逻辑 - 例如操作。
层次结构只应该知道下面的内容,而不是上面的内容; 因此,DTO应该保存在服务层中,并由负责者 - 例如命令处理器 - 消耗,以从存储库检索域对象并执行所涉及的任何操作。
底线:DTO不适用于域,它们属于服务/通信。

谢谢!你提供了一个命令处理器的例子。这让我想到,可以在ServiceLayer中完成Dto->Aggregate和Aggregate->Dto的转换,而不需要使用DtoAssembler。你认为这比拥有一个“聪明”的DtoAssembler更好吗?DtoAssembler不仅能够获取Aggregate,还能对其进行更改(可能会出现Dto中的数据与检索到的Aggregate的数据不同,而Id相同的情况)。 - Andrey K.
3
DtoAssembler应该尽可能地简单,通常它只是将一个对象的字段映射到另一个对象上 - 例如,在聚合和DTO之间。 - jnovo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接