我应该在哪里进行转换:域对象<-> DTO?

Posted

技术标签:

【中文标题】我应该在哪里进行转换:域对象<-> DTO?【英文标题】:where should I do the conversion: Domain object<->DTO? 【发布时间】:2011-01-27 03:40:36 【问题描述】:

在域层还是数据访问层?

【问题讨论】:

【参考方案1】:

DTO 的主要动机是呈现为另一层(通常是表示层)量身定制的界面。例如,数据输入屏幕可能需要来自用户对象的一些数据位以及来自订单等的一些位。在这种情况下,DTO 的域应该发生在表示层调用的层,即通常“服务”层。

有像 Dozer 这样的库可以自动完成在域模型和 DTO 之间转换的繁重工作。

关键是 DTO 旨在从更丰富的领域模型对象中抽象出数据(而不是业务逻辑)——因此,DTO 应该尽早(在服务层)转换回领域对象,这样其余的您的应用层可以使用更丰富的领域对象(数据和业务逻辑)

【讨论】:

【参考方案2】:

我不太喜欢 DTO,但我说不要在数据层这样做。数据层处理模型对象及其持久性。为什么要通过将 DTO 引入其中来将其与其他层耦合?我会将它们映射到其他地方,可能在服务层和 ui 层之间,就在它们跨越创建它们的位置和使用它们的位置之间的边界处。

【讨论】:

【参考方案3】:

把它放在 MVC 上下文中,如果你有控制器和服务层,你应该把它放在控制器中。这将使 DTO 更接近视图层,并允许服务层仅使用域对象,避免与其他模型混淆。

DTO 本身其实就是 MVC 模型(此处解释:https://***.com/a/1058186)。

下面是一个推荐的教程,它将控制器、服务层和 DTO 概念混合在一起(在 java 中使用 Spring 框架,但其他平台的概念也很清楚): https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application

【讨论】:

以上是关于我应该在哪里进行转换:域对象<-> DTO?的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 领域对象处理最佳实践

我应该把我的 DTO 放在哪里?

使用 <ui:composition> 模板时,我应该在哪里声明 <f:metadata>?

使用 <ui:composition> 模板时,我应该在哪里声明 <f:metadata>?

在哪里放置需要从数据库中获取数据的域逻辑

应该使用哪个层从域对象转换为 DTO