我们有两个外部社交媒体渠道,想消费它们的API。我们消费这些API的方式取决于我们客户的要求。我们必须设计我们的应用程序,使其满足下面列出的两个实际生活场景。
-
当从外部消费时,外部的API需要不同的实现。消费者使用什么环境并不重要。
-
外部API在被外部消费时需要精确的实现。消费者使用什么环境并不重要。
你可以想象,如果你处理的是属于第一种情况的外部API,那么你的代码或结构中很可能会有一些重复,以及一些额外的逻辑需要处理。然而,如果你处理的是属于第二种情况的外部API,你的生活就会非常容易。你所要处理的只是一个配置参数。
在这个例子中,我们将看到两种情况下的例子。但这还没有结束。这两种方案都有两个子方案,如下所示。
-
客户端决定了请求中的通道和环境。
-
客户端在请求中决定了通道,但环境是由应用程序继承的。
在第一种情况下,客户端发送name 和env 查询参数。在第二种情况下,客户端发送name 查询参数。基于上述情况,我们的应用程序将选择正确的 "通道 "和 "环境",然后相应地点击外部API。这是一种策略设计模式。
最后,这些是我们的例子。我们将创建令牌、刷新令牌、发送消息和上传图片作为API合同。
-
外部API在被外部消费时需要不同的实现。消费者使用什么环境确实很重要。
-
客户端决定了请求中的通道和环境。
-
客户端决定了请求中的通道,但环境是由应用程序继承的。
-
外部API在被外部消费时需要精确的实现。消费者使用什么环境并不重要。
-
客户端决定了请求中的通道和环境。
-
客户端决定了请求中的通道,但环境是由应用程序继承的。
在下面的实现中,SocialMedia 是通用的接口。无论一个通道是否需要一个方法,它都必须被继承,至少要有一个空的主体。同时,这些方法也必须有相同的签名。为此,你也必须对参数进行标准化。也许可以用一个通用的配置结构。从设计角度来看,2.2 是最好的,1.1 是最差的实现方案。你可以根据你的需要来调整这些例子,所以它们只是为了给你一个概念。
1.1
外部API在被外部消费时需要不同的实现。消费者使用什么环境确实很重要。客户端决定了请求中的通道和环境。
端点
# Image upload
结构
├── cmd
文件
cmd/socialise/main.go
package main
internal/image/upload.go
package image
internal/message/send.go
package message
内部/pkg/socialmedia/channel.go
package socialmedia
内部/pkg/socialmedia/facebook/production/facebook.go
package production
内部/pkg/socialmedia/facebook/production/image.go
package production
内部/pkg/socialmedia/facebook/production/message.go
package production
内部/pkg/socialmedia/facebook/production/token.go
package production
内部/pkg/socialmedia/facebook/sandbox/facebook.go
package sandbox
内部/pkg/socialmedia/facebook/sandbox/image.go
package sandbox
内部/pkg/socialmedia/facebook/sandbox/message.go
package sandbox
内部/pkg/socialmedia/facebook/sandbox/token.go
package sandbox
内部/pkg/socialmedia/twitter/production/image.go
package production
内部/pkg/socialmedia/twitter/production/message.go
package production
内部/pkg/socialmedia/twitter/production/token.go
package production
内部/pkg/socialmedia/twitter/production/twitter.go
package production
内部/pkg/socialmedia/twitter/sandbox/image.go
package sandbox
内部/pkg/socialmedia/twitter/sandbox/message.go
package sandbox
内部/pkg/socialmedia/twitter/sandbox/token.go
package sandbox
内部/pkg/socialmedia/twitter/sandbox/twitter.go
package sandbox
internal/token/create.go
package token
内部/token/refresh.go
package token
1.2
外部API在被外部消费时需要不同的实现。消费者使用什么环境确实很重要。客户端决定了请求中的通道,但环境是由应用程序继承的。
端点
# Image upload
结构
├── cmd
文件
cmd/socialise/main.go
package main
internal/image/upload.go
package image
internal/message/send.go
package message
内部/pkg/socialmedia/channel.go
package socialmedia
内部/pkg/socialmedia/facebook/production/facebook.go
package production
内部/pkg/socialmedia/facebook/production/image.go
package production
内部/pkg/socialmedia/facebook/production/message.go
package production
内部/pkg/socialmedia/facebook/production/token.go
package production
内部/pkg/socialmedia/facebook/sandbox/facebook.go
package sandbox
内部/pkg/socialmedia/facebook/sandbox/image.go
package sandbox
内部/pkg/socialmedia/facebook/sandbox/message.go
package sandbox
内部/pkg/socialmedia/facebook/sandbox/token.go
package sandbox
内部/pkg/socialmedia/twitter/production/image.go
package production
内部/pkg/socialmedia/twitter/production/message.go
package production
内部/pkg/socialmedia/twitter/production/token.go
package production
内部/pkg/socialmedia/twitter/production/twitter.go
package production
内部/pkg/socialmedia/twitter/sandbox/image.go
package sandbox
内部/pkg/socialmedia/twitter/sandbox/message.go
package sandbox
内部/pkg/socialmedia/twitter/sandbox/token.go
package sandbox
内部/pkg/socialmedia/twitter/sandbox/twitter.go
package sandbox
internal/token/create.go
package token
内部/token/refresh.go
package token
2.1
外部API在被外部消费时需要精确的实现。消费者使用什么环境并不重要。客户端决定了请求中的通道和环境。
端点
# Image upload
结构
├── cmd
文件
cmd/socialise/main.go
package main
internal/image/upload.go
package image
internal/message/send.go
package message
内部/pkg/socialmedia/channel.go
package socialmedia
内部/pkg/socialmedia/facebook/facebook.go
package facebook
内部/pkg/socialmedia/facebook/image.go
package facebook
内部/pkg/socialmedia/facebook/message.go
package facebook
内部/pkg/socialmedia/facebook/token.go
package facebook
内部/pkg/socialmedia/twitter/image.go
package twitter
内部/pkg/socialmedia/twitter/message.go
package twitter
内部/pkg/socialmedia/twitter/token.go
package twitter
内部/pkg/socialmedia/twitter/twitter.go
package twitter
内部/token/create.go
package token
内部/token/refresh.go
package token
2.2
外部API在被外部消费时需要精确的实现。消费者使用什么环境并不重要。客户端决定了请求中的通道,但环境是由应用程序继承的。
端点
# Image upload
结构
├── cmd
文件
cmd/socialise/main.go
package main
internal/image/upload.go
package image
internal/message/send.go
package message
内部/pkg/socialmedia/channel.go
package socialmedia
内部/pkg/socialmedia/facebook/facebook.go
package facebook
内部/pkg/socialmedia/facebook/image.go
package facebook
内部/pkg/socialmedia/facebook/message.go
package facebook
内部/pkg/socialmedia/facebook/token.go
package facebook
内部/pkg/socialmedia/twitter/image.go
package twitter
内部/pkg/socialmedia/twitter/message.go
package twitter
内部/pkg/socialmedia/twitter/token.go
package twitter
内部/pkg/socialmedia/twitter/twitter.go
package twitter
内部/token/create.go
package token
内部/token/refresh.go
package token