传入和传出DTO的最佳做法

时间:2019-09-25 00:07:57

标签: java rest api-design

我面临API设计问题。请考虑以下流程:

flow

如您所见,我有2个类来代表我的模型(SomethingDTOSomethingResponse)和2个类来代表第三方模型(3rdPartyRequest3rdPartyResponse )。我正在使用映射器来提供从3rdPArty模型类到我的模型类的翻译。

问题是:所有这四个类都具有完全相同的属性。

我应该在所有这些类中重复这些属性吗?整个流程中我应该只有一个DTO课程吗?

解决此问题的最佳实践(或模式)是什么?

谢谢

2 个答案:

答案 0 :(得分:2)

这是一个艰难的过程。务实VS正确。

正确的方法(在我看来)是每个请求/响应都有不同的类,这就是您所做的。这是因为我尝试使用Ports and Adapters architecture设计应用程序,并且还使用域驱动设计。好处是,在对象开始发散的情况下,这样做可以提供更大的灵活性和清晰度。

如果这些类具有完全相同的属性,我将采取一种实用的方法,即每层具有一个类。因此,一个用于您的Web请求/响应,另一个用于第三方。但是在任何情况下,“我”都不会混合两个集成层(前端和第三方)。

整个课程只有一堂课,真的很难闻。如上所述,因为这是混合层(或端口)。

答案 1 :(得分:1)

previously answered一样,使用DTO有助于将持久性模型与API模型解耦。因此,您似乎做对了。

  

问题是:所有这四个类都具有完全相同的属性。

将API的模型与第三方API的模型脱钩始终是一个好主意。如果第三方API更改了他们的合同,则不会破坏您的客户。因此,对每个API使用不同的模型。

并坚持使用mapping frameworks,例如MapStruct,以减少样板代码。您可能还需要考虑使用Lombok为您生成getter,setter,equals()hashcode()toString()方法。

  

我应该在所有这些类中重复这些属性吗?整个流程中我应该只有一个DTO课程吗?

如果请求和响应模型都包含相同的字段集,则可以从单个类开始,以表示每个的请求和响应负载 API。当字段开始不同时(请求有效负载与响应有效负载不同),则可以创建用于表示每个有效负载的新模型。

从长远来看,对请求和响应使用不同的模型将为您提供灵活性,确保您仅公开和接收想要的属性。