我正在使用 Google wire在我的一个 Go 项目中连接依赖项。到目前为止,所有依赖项都已成功连接。
我有以下容器:
type Container struct {
Logger logger.StructuredLogger
IDGenerator idgenerator.IDGenerator
Arango arangodb.Arango
}
这里StructuredLogger
、IDGenerator
和Arango
是接口(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/