走线,连接依赖项

标签 go dependency-injection inversion-of-control

我正在使用 Google wire在我的一个 Go 项目中连接依赖项。到目前为止,所有依赖项都已成功连接。

我有以下容器:

type Container struct {
    Logger               logger.StructuredLogger
    IDGenerator          idgenerator.IDGenerator
    Arango               arangodb.Arango
}

这里StructuredLoggerIDGeneratorArango是接口(interface)。

容器集定义如下:

var mockContainerSet = wire.NewSet(
    Container{},
    ResolveStructuredLogger,
    ResolveIDGenerator,
    ResolveArangoDB,
)

函数:

func ResolveStructuredLogger() logger.StructuredLogger {
    panic(wire.Build(wire.InterfaceValue(new(logger.StructuredLogger), logrusprovider.NewLogrusLogger(nil))))
}

func ResolveIDGenerator() idgenerator.IDGenerator {
    panic(wire.Build(wire.InterfaceValue(new(idgenerator.IDGenerator), examples.NewKSUIDGenerator())))
}

现在的问题是我想为 Arango 创建一个提供者。 Arango 提供程序的工厂方法将 IDGenerator 作为参数。

func NewMockedArango(generator idgenerator.IDGenerator) (*MockedArango, error){
    if generator == nil {
        return nil , errors.New("mock arangodb expects a valid IDGenerator")
    }
    return &MockedArango{generator:generator}, nil
}

arangodb.Arango 中的所有功能都已实现。我尝试了以下方法来创建一个提供者:

func ResolveMockArangoDB(idGenerator idgenerator.IDGenerator) (arangodb.Arango, error) {
    panic(wire.Build(wire.InterfaceValue(new(arangodb.Arango), mockdb.NewMockedArango(idGenerator))))
}

但是线路报错,我尝试了很多方法都没有成功。有帮助吗?

错误:

2-valued mockdb.NewMockedArango(idGenerator) (value of type (*github.com/tejashwi/catalog-manager-svc/pkg/webservice/arangodb/mockdb.MockedArango, error)) where single value is expected

最佳答案

wire.Interface 的签名是 InterfaceValue(典型接口(interface){},x 接口(interface){})

这里你需要传递两个单值参数。在第二个参数中,您传递的是双值参数,因为函数 mockdb.NewMockedArango 返回 2 个值。

您可以将 ResolveMockArangoDB 函数更改为:

func ResolveMockArangoDB(idGenerator idgenerator.IDGenerator) (arangodb.Arango, error) {
    mockedArango, err := mockdb.NewMockedArango(idGenerator)
    <HANDLE err>
    panic(wire.Build(wire.InterfaceValue(new(arangodb.Arango), mockedArango)))
}

关于走线,连接依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54077969/

相关文章:

c#-3.0 - 扩展方法会隐藏依赖关系吗?

web-services - 您应该如何为多模块 Spring Maven 项目组织 applicationContext 文件?

spring - Spring Autowiring 有什么好处

java - @Inject 字段的空对象

go - 在 Golang 中,json 解码器返回一个空结构,但 ioutil.ReadAll 显示消息

sql - 使用 slice IN 子句的 Golang 数据库查询

authentication - golang中的单点登录认证

maven - Java 7 独立应用程序中的依赖注入(inject)

java - 如何在Spring Boot应用程序的main方法中正确初始化Bean?

golang如何访问提升类型