我正在尝试找出设计以下场景的最佳方法。
让我们假设,我已经有了一个REST API
实现,它将从不同的提供者那里获取书籍,并将它们提供给我自己的客户端。
- 每个提供商都提供一个单独的
API
来为其消费者提供图书服务。 - 每个提供者的响应结构与前一个完全不同。
- 我的客户端应该总是得到完全相同的格式,所以前端客户端应用程序可以处理响应。
一些输出示例:
提供者1
[
{
"bookId": 32,
"bookName": "foo",
"author" : {
"name" : "John",
"surname": "Doe"
},
"publisher": {
"name" : "Foo Books",
"address": "New York"
}
},
...
]
供应商2
[
{
"publisherCompany": {
"name": "Foo Books",
"position": "New York",
"books": [
{
"id": 32,
"title": "Foo",
"author": {
"name" : "John",
"lastName": "Doe"
}
},
...
]
}
},
...
]
这两个提供程序都输出相同的值,但格式不同。而且有些键是完全不同的。
我正在寻找的是一个架构设计或设计模式,所以我可以将每个不同的输出映射到我自己的格式。
我过去做过什么
- 我已经创建了我自己的实体
- 我为每个消费者提供不同的服务,在获取数据后,我实例化了我自己的实体并相应地映射了响应。
- 在我的对象(实体)填满数据后,我将它们传递给变压器函数以将它们转换为所需的输出。
我的问题:
- 是否有
Design Pattern
用于此? - 这个场景有什么术语吗,这样我可以做一个研究?
- 你会如何处理这种情况? 有阅读资源吗?
谢谢,)
并非所有东西都必须遵循设计模式或有名称,只需使用您的知识和常识。
在这种情况下,您需要做的是:
- 拥有自己的领域模型和服务层,可以从所有的提供商那里获取数据。
- 为提供者1模型提供一个特定的模型和一个特定的服务层,该服务层将处理对提供者1的调用和到您自己的域模型的映射。
- 为提供者2模型提供一个特定的模型和一个特定的服务层,该服务层将处理对提供者2的调用和到您自己的域模型的映射。
与提供者1和2相关的两个服务应该实现相同的接口,该接口指定了您可能需要的其他提供者服务的契约。这将是您的域服务层将知道和使用的接口。
这或多或少是你已经拥有的,但如果你想给它一个名字,你可以阅读六边形架构,它与所描述的解决方案有一些相似之处。我建议购买以下文章:
- https://medium.com/ssense-tech/hexagonal-architecture-there-are-always-two-sides-to-every-story-bc0780ed7d9c
- https://reflectoring.io/spring-hexagonal/