第三方配置结构的封装



我正在做一个Go项目,我正在利用一些相当大的第三方客户端库与一些第三方REST API进行通信。我的目的是将我的内部代码 API 与这些特定的依赖项分离。

在我的代码中将这些库分离特定方法很简单,因为我只需要功能的子集,并且能够抽象用例。因此,我在我的代码中引入了一种新类型,它实现了我的特定用例;然后,基础实现依赖于第三方依赖项。

我有问题的地方是configuration structs.通常,我使用的客户端库提供了这种形式的一些函数

createResourceA(options *ResourceAOptions) (*ResourceA, error)
createResourceB(options *ResourceBOptions) (*ResourceB, error)

其中*ResourceA*ResourceB是相应资源创建后的服务器端配置。

不同的options是相当大的配置结构,用于具有大量字段、嵌套结构等的资源。一般来说,这些配置包含比我的应用程序中需要的更多选项,但总体重叠最终相当大。

由于我想避免我的内部代码必须导入特定的依赖项才能访问我想要封装这些的配置结构。

我目前的封装方法是定义我自己的配置结构,然后我用它来配置第三方依赖项。举一个简单的例子:

import a "github.com/client-a"
// MyClient implements my use case functions
type MyClient struct{}
// MyConfiguration wraps more or less the configuration options
// provided by the client-a dependency
type MyConfiguration struct{
Strategy StrategyType
StrategyAOptions *StrategyAOptions
StrategyBOptions *StrategyBOptions
}
type StrategyType int
const (
StrategyA StrategyType = iota
StrategyB
)
type StrategyAOptions struct{}
type StrategyBOptions struct{}

func (c *MyClient) UseCaseA(options *MyConfiguration) error {
cfg := &a.Config{}
if (options.Strategy = StrategyA) {
cfg.TypeStrategy = a.TypeStrategyXY
}
...
a.CreateResourceA(cfg)
}

如示例所示,使用此方法,我可以封装第三方配置结构,但我认为此解决方案的扩展性不是很好。我已经遇到了一些示例,在这些示例中,我基本上是从代码中的依赖项重新实现类型,只是为了将依赖项抽象出来。

在这里,我正在寻找更复杂的解决方案和/或一些见解,如果我的方法通常是错误的。

我的进一步研究:

我调查了struct embedding,如果这对我有帮助。但是,由于配置包含非平凡的成员,我最终也会在调用代码中导入依赖项以填充字段。

由于通常的指导方针似乎是Accept interfaces return structs我试图用这种方法找到一个好的解决方案。但是在这里,我最终也可以得到一个相当大的接口,并且在go中标准库配置结构似乎不通过接口使用。如果将配置隐藏在接口后面是 Go 中的良好做法,我找不到明确的声明。

总结一下:

我想知道如何从第三方库中抽象配置结构,而不会最终在我的代码中重新定义相同的数据类型。

一件非常简单的事情呢 - 重新定义包装包中需要的结构类型?

我是新手,所以这可能不是最好的方法。

package myConfig
import a "github.com/client-a"
type aConfig a.Config

那么你只需要导入你的 myConfig 包

import "myConfig"
// myConfig.aConfig is actually a.Config
myConfig.aConfig

不太确定这是否有很大帮助,因为这不是真正的解耦,但至少您不需要在每个地方导入"github.com/client-a">

最新更新