我面临API设计问题。请考虑以下流程:
如您所见,我有2个类来代表我的模型(SomethingDTO
和SomethingResponse
)和2个类来代表第三方模型(3rdPartyRequest
和3rdPartyResponse
)。我正在使用映射器来提供从3rdPArty模型类到我的模型类的翻译。
问题是:所有这四个类都具有完全相同的属性。
我应该在所有这些类中重复这些属性吗?整个流程中我应该只有一个DTO课程吗?
解决此问题的最佳实践(或模式)是什么?
谢谢
答案 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。当字段开始不同时(请求有效负载与响应有效负载不同),则可以创建用于表示每个有效负载的新模型。
从长远来看,对请求和响应使用不同的模型将为您提供灵活性,确保您仅公开和接收想要的属性。