[英]Microservices Restful API - DTOs or not?
我想在微服务的上下文中重新提出这个问题。 这是原始问题的引用。
我目前正在为一个项目创建一个 REST-API,并且一直在阅读有关最佳实践的文章。 许多人似乎反对 DTO,只是简单地公开领域模型,而其他人似乎认为 DTO(或用户模型或任何你想称呼的)是不好的做法。 就个人而言,我认为这篇文章很有意义。
但是,我也理解 DTO 的缺点,包括所有额外的映射代码、可能与其 DTO 对应物 100% 相同的域模型等等。
我更倾向于在我的应用程序的所有层中使用一个对象(换句话说,只公开域对象而不是创建 DTO 并手动复制每个字段)。 并且可以使用 Jackson 注释(如@JsonIgnore
或@JsonProperty(access = Access.WRITE_ONLY)
或@JsonView
等)解决我的 Rest 合约与域对象之间的差异。 或者,如果有一两个字段需要使用 Jackson Annotation 无法完成的转换,那么我将编写自定义逻辑来处理这个问题(相信我,我在 5 年多的时间里甚至没有遇到过这种情况休息服务的长途旅行)
我想知道我是否因为不将域复制到 DTO 而遗漏了任何真正的不良影响
我会投票支持使用 DTO,原因如下:
mybatis.configuration.map-underscore-to-camel-case: true
例如mybatis.configuration.map-underscore-to-camel-case: true
, spring.jackson.property-naming-strategy: SNAKE_CASE
短篇小说,至少在我的情况下,缺点并没有超过优点,因此通过将新的 POJO 作为 DTO 来重复自己没有任何意义。 更少的代码,更少的错误机会。 因此,继续公开域对象而不是拥有单独的“视图”对象。
免责声明:这可能适用于您的用例,也可能不适用。 这个观察是根据我的用例(基本上是一个具有 15 个端点的 CRUD api)
如果您使用 CQRS,这个决定会简单得多,因为:
Commands
; Aggregates
- 域层中的丰富行为对象 - 不会公开/查询,因此那里没有问题。readmodel
。 在最坏的情况下,您可以使用 GraphQL 之类的东西来仅选择您需要的字段。如果您不将读取与写入分开,那么决策将更加困难,因为这两种解决方案都需要权衡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.