传入和传出 DTO 的最佳实践

Best Practices for incoming and outgoing DTOs

我遇到了 API 设计问题。考虑以下流程:

如您所见,我有 2 个 class 代表我的模型(SomethingDTOSomethingResponse)和 2 个 class 代表第 3 方模型(3rdPartyRequest3rdPartyResponse)。我正在使用映射器提供从 3rdPARty 模型 classes 到我的模型 classes.

的翻译

问题是:这4个class的属性完全一样

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

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

谢谢

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

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

如果 class 具有完全相同的属性,我会采取务实的方法,每层有一个 class。因此,一份用于您的 Web request/response,一份用于第三方。但在任何情况下 'I' 都不会混合 2 个集成层(前端和第 3 方)。

整个事情只有一个 class 真的很难闻。正如我上面提到的,因为那是混合层(或端口)。

正如我 previously answered,使用 DTO 有助于 将持久性模型与 API 模型分离。所以你似乎在做正确的事。

The problem is: all these 4 classes have exactly the same attributes.

将您 API 的模型与第三方 API 的模型分离总是一个好主意。如果第三方 API 更改 他们的 合同,您不会破坏 您的 客户。所以每个 API 使用不同的模型。

并坚持 mapping frameworks, such as MapStruct, to reduce the boilerplate code. You also may want to consider Lombok 为您生成 getter、setter、equals()hashcode()toString() 方法。

Should I repeat these attributes through all these classes? Should I have only one DTO class for the whole flow?

如果请求和响应模型都包含同一组字段,那么您可以从单个class开始用于表示 each API 的请求和响应有效载荷。当字段开始不同(请求负载不同于响应负载)时,您将创建新模型来表示每个负载。

在较长的 运行 中,对请求和响应使用不同的模型将为您提供灵活性,确保您只公开和接收您想要的属性。