我想在微服务中重新提出这个问题'上下文。这是原始问题的引用。
我目前正在为项目创建一个REST-API并且一直在阅读 关于最佳做法的文章。许多人似乎反对 DTO只是公开域模型,而其他人似乎 认为DTO(或用户模型或任何你想称之为的东西)是坏的 实践。就个人而言,我认为这篇文章很有道理。
然而,我也理解DTO的所有额外的缺点 映射代码,可能与其完全100%相同的域模型 DTO-pair等等。
我更倾向于在我的应用程序的所有层中使用一个Object(换句话说,只显示域对象而不是创建DTO并手动复制每个字段)。我可以使用杰出注释(例如@JsonIgnore
或@JsonProperty(access = Access.WRITE_ONLY)
或@JsonView
等)来解决合同与代码之间的差异。或者如果有一个或两个字段需要使用Jackson Annotation无法完成的转换,那么我将编写自定义逻辑来处理这一点(相信我,我甚至没有遇到过这种情况,甚至在我的5中也没有+多年的休息服务之旅)
我想知道我是否遗漏了没有将域名复制到DTO的任何真正的不良影响
答案 0 :(得分:15)
我会投票支持使用DTO,原因如下:
答案 1 :(得分:3)
mybatis.configuration.map-underscore-to-camel-case: true
,spring.jackson.property-naming-strategy: SNAKE_CASE
短篇小说,至少在我的情况下,缺点并不比专业人士好,所以通过新的POJO作为DTO重复自己没有任何意义。代码减少,错误机会减少。因此,继续公开Domain对象,而不是单独的"视图"对象
免责声明:这可能适用于您的使用案例,也可能不适用。这个观察结果是我的用例(基本上是一个有15个端点的CRUD api)
答案 2 :(得分:1)
如果你使用CQRS,决定会更简单,因为:
Commands
; Aggregates
- 域层中的丰富行为对象 - 不会公开/查询,因此没有问题。readmodel
。在最坏的情况下,您可以使用GraphQL之类的东西来仅选择您需要的字段。如果你没有将读取与写入分开,则决定更难,因为两种解决方案都存在权衡。