当前位置: 首页 > 面试题库 >

微服务Restful API-是否DTO?

于恺
2023-03-14
问题内容

我想在微服务的背景下再次提出这个问题。这是原始问题的报价。

我目前正在为一个项目创建REST-
API,并且一直在阅读有关最佳实践的文章。许多人似乎反对DTO并只是公开域模型,而其他人似乎认为DTO(或用户模型或任何您想称呼的东西)是不好的做法。我个人认为这篇文章很有道理。

但是,我还了解了所有其他映射代码,域模型与其DTO对应对象100%相同的DTO的缺点。

我更倾向于在应用程序的所有层中使用一个对象(换句话说,只公开域对象而不是创建DTO并在每个字段上手动复制)。我的合同与代码之间的差异可以使用Jackson注释(如@JsonIgnore或`@JsonProperty(access

Access.WRITE_ONLY)@JsonView`等)解决。或者,如果有一个或两个字段需要使用杰克逊注释无法完成的转​​换,那么我将编写自定义逻辑来处理该问题(相信我,我有5年以上的经验,甚至从未遇到过这种情况)长期的休息服务)

我想知道是否由于未将域复制到DTO而错过任何真正的不良影响


问题答案:

只公开域对象的优点

  1. 您编写的代码越少,产生的错误也越少。
    • 尽管在我们的代码库中有大量(可争论的)测试用例,但由于从域到DTO或反之亦然的字段复制遗漏/错误,我还是遇到了一些错误。
  2. 可维护性-减少锅炉板代码。
    • 如果必须添加新属性,则不必添加Domain,DTO,Mapper和测试用例。不要告诉我这可以使用反射beanCopy utils来实现,它违背了整个目的。
    • 我知道Lombok,Groovy和Kotlin,但这只会让我省却吸气剂的困扰。
  3. 干燥
  4. 性能
    • 我知道这属于“过早的性能优化是万恶之源”的范畴。但这仍然可以节省一些CPU周期,而不必每次请求至少创建(至少)一个对象(然后进行垃圾回收)

缺点

  1. 从长远来看,DTO将为您提供更大的灵活性
    • 如果我需要这种灵活性。至少,到目前为止,我遇到的都是对HTTP的CRUD操作,我可以使用几个@JsonIgnores来进行管理。或者,如果有一个或两个字段需要使用杰克逊注释无法完成的转​​换,正如我之前所说,我可以编写自定义逻辑来处理该问题。
  2. 域对象因注释而肿。
    • 这是一个有效的担忧。如果我使用JPA或MyBatis作为持久性框架,则域对象可能具有这些注释,那么也将有Jackson注释。就我而言,这不太适用,我使用的是Spring boot,我可以通过使用应用程序范围的属性(如mybatis.configuration.map-underscore-to-camel-case: truespring.jackson.property-naming-strategy: SNAKE_CASE

短篇小说
,至少就我而言,缺点并没有超过优点,因此以新的POJO作为DTO来重复自己毫无意义。更少的代码,更少的错误机会。因此,继续公开Domain对象并且没有单独的“
view”对象。

免责声明 :这可能适用于您的用例,也可能不适用。此观察是根据我的用例(基本上是具有15ish端点的CRUD api)



 类似资料:
  • 问题内容: REST API-是否有DTO? 我想在微服务的背景下再次提出这个问题。这是原始问题的报价。 我目前正在为一个项目创建REST- API,并且一直在阅读有关最佳实践的文章。许多人似乎反对DTO,只是公开域模型,而其他人似乎认为DTO(或用户模型或任何您想称呼的东西)是不好的做法。我个人认为这篇文章很有道理。 但是,我还了解了所有其他映射代码,域模型与其DTO对应对象100%相同的DTO

  • 微丝网应该可重复使用吗?对于可重用,我并不意味着共享特定于域的模型。 我的意思是,为一个应用程序创建的微服务是否应该在另一个应用程序中重用?如果它们可以在应用程序中重用,是否足够? 分离微服务的最佳方法是什么。从我的观点来看,一旦一个微服务调用另一微服务,它就会紧密耦合,这意味着它不容易(无需修改)被提取并放入另一个没有它所引用/来自的相同服务的微服务应用程序中。 在我看来,要使它们脱钩,有以下几

  • 主要内容:微服务架构,微服务架构 vs 单体架构,微服务的特点,微服务框架微服务(MicroServices)最初是由 Martin Fowler 于 2014 年发表的论文 《 MicroServices》 中提出的名词,它一经提出就成为了技术圈的热门话题。 微服务,我们可以从字面上去理解,即“微小的服务”,下面我们从“服务”和“微小”两个方面进行介绍。 1) 所谓“服务”,其实指的是项目中的功能模块,它可以帮助用户解决某一个或一组问题,在开发过程中表现为 IDE(集

  • thinkphp5编写的restful风格的API,集API请求处理,权限认证,自动生成文档等功能

  • 我有几个微服务,每个微服务都有用于CRUD操作的RESTendpoint。我必须创建一个工作流,该工作流将从一个带有一些初始输入的微服务开始,但一个微服务的稍后输出可以用作其他微服务的输入。可以对这些REST API进行一些同步和异步调用。 我已经寻找了一些工作流引擎,但我不认为我可以在不编写任何java代码的情况下创建我的工作流。

  • 基本 Nest 微服务是一种使用与HTTP不同的传输层的应用程序。 安装 首先,我们需要安装所需的软件包: $ npm i --save @nestjs/microservices 概述 通常,Nest支持一系列内置的传输器。它们基于 请求-响应 范式,整个通信逻辑隐藏在抽象层之后。多亏了这一点,您可以轻松地在传输器之间切换,而无需更改任何代码行。我们不支持具有基于日志的持久性的流平台,例如 Ka

  • 作为将微服务连接在一起并使其工作的机制,通常建议使用API和服务发现。但它们通常作为自己的微服务工作,但这些微服务显然应该“硬编码”到其他微服务中,因为每个微服务都应该向它们注册并查询其他微服务的位置。这是否打破了松耦合的思想,因为发现服务的丢失意味着其他服务无法通信?

  • 本文向大家介绍什么是微服务架构?相关面试题,主要包含被问及什么是微服务架构?时的应答技巧和注意事项,需要的朋友参考一下 在前面你理解什么是微服务,那么对于微服务架构基本上就已经理解了。 微服务架构 就是 对微服务进行管理整合应用的。微服务架构 依赖于 微服务,是在微服务基础之上的。 例如:上面已经列举了什么是微服务。在医院里,每一个科室都是一个独立的微服务,那么 这个医院 就是 一个大型的微服务架