Domain driven design DDD:Dto汇编程序应该是域层的一部分吗?

Domain driven design DDD:Dto汇编程序应该是域层的一部分吗?,domain-driven-design,implementation,layer,dto,project-organization,Domain Driven Design,Implementation,Layer,Dto,Project Organization,提前谢谢 我在域层库中有一些聚合。另外,一些DTO位于单独的库中,在服务器端和客户端之间共享 实体的聚合比其DTO更具信息性。因此,为了从DTO转换为聚合,DTO汇编程序应该访问存储库。存储库的接口位于域层。这就是为什么我得出结论,DTOAsembler应该是DomainLayer的一部分 这是对的吗?依我看,不一定。由于您使用的是分层体系结构,因此我假设DTO位于上层(通常是服务层),充当服务器和客户端之间的通信点。事实上,DTO的主要用途正如其名称所暗示的(数据传输对象)是为了实现通信,在不

提前谢谢

我在域层库中有一些聚合。另外,一些DTO位于单独的库中,在服务器端和客户端之间共享

实体的聚合比其DTO更具信息性。因此,为了从DTO转换为聚合,DTO汇编程序应该访问存储库。存储库的接口位于域层。这就是为什么我得出结论,DTOAsembler应该是DomainLayer的一部分


这是对的吗?依我看,不一定。由于您使用的是分层体系结构,因此我假设DTO位于上层(通常是服务层),充当服务器和客户端之间的通信点。事实上,DTO的主要用途正如其名称所暗示的(数据传输对象)是为了实现通信,在不附加任何逻辑(例如操作)的情况下传输信息

层应该只知道那些位于下面的,而不是上面的;因此,DTO应该保存在服务层中,并由负责人(例如,命令处理器)使用,以便从存储库检索域对象并执行所涉及的任何操作

一句话:DTO不适用于域,它们属于服务/通信。

不,这在DDD的上下文中是完全错误的。 尝试询问(非技术性)领域专家对DTO汇编程序的看法。他会用怀疑的大眼睛看着你

DTO(及其汇编程序)是一个技术概念-它们在系统特定接口的上下文中定义数据结构。

存储库大多返回聚合。如果查询数据库中未在域中建模的统计数据,则存储库也可能返回不可变的数据对象。只需确保在执行此操作时不会意外遗漏域概念


一旦从存储库中获得数据(无论是聚合还是数据对象),就可以将其输入DTO汇编程序。

谢谢您的回答。我仍在努力把这一切整合起来。我稍微修改了一下我的问题。DTOASembler指示存储库应该有哪些方法。存储库的接口是DL。这就是为什么我开始认为DTOAsembler是DL的一部分……我的错误是我想使用DTOAsembler将Dto转换为聚合。多亏了这些答案,我知道最好在应用服务中进行转换和应用。谢谢!DtoAssembler使用IRepository将Dto转换为聚合,对吗?DTOAsembler应该是“聪明”的,它不仅应该获得聚合,而且应该对其应用更改,这是对的吗?(这是因为Dto中的数据可能与检索到的聚合的数据不同,而Id是相同的…?)我会保持DTOAsembler的简单,并在应用程序服务中执行所有不重要的操作。通过这种方式,DTOAsembler只需获取构造DTO所需的输入,在必要时应用转换(例如序列化),然后返回DTO。谢谢,我喜欢这个想法:),那么反过来,从DTO到聚合的转换呢?我可能有一个误导性的想法,DtoAssembler也应该能够从Dto转换为聚合…在大多数情况下,直接将Dto转换为聚合是没有意义的。您确定要使用DDD吗?听起来很像你在构建一个CRUD风格的应用程序。我建议您阅读DDD应用程序服务。它们适用于您在DTOAsembler中尝试执行的操作。谢谢!您提供了命令处理器的示例。这使我认为可以在ServiceLayer中完成Dto->Aggregate和Aggregate->Dto的转换,从而避免使用DTOAsembler。您认为这是一种比拥有一个“聪明”的DTOASembler更好的方法吗?DTOASembler不仅应该能够获取聚合,还应该对其应用更改?(Dto中的数据可能不同于检索到的聚合的数据,而Id是相同的)DTOAsembler应该尽可能哑,通常它只会将字段从一个对象映射到另一个对象,例如,在聚合和Dto之间。