我正在尝试使用 google/wire 进行依赖注入(inject)。
当我使用 wire check
终端中的命令,它显示no provider found for *my_go_app.Listener, output of injector
.
// +build wireinject
package main
import (
"fmt"
"github.com/google/wire"
)
type Speaker interface {
Say()
}
type HelloSpeaker struct {
word string
}
func NewHelloSpeaker() *HelloSpeaker {
return &HelloSpeaker{
word: "Hello, World!!",
}
}
func (s *HelloSpeaker) Say() {
fmt.Printf("%s", s.word)
}
type Listener interface {
WhatIListened()
}
type SimpleListener struct {
speaker *Speaker
}
func NewSimpleListener(speaker *Speaker) *SimpleListener {
return &SimpleListener{
speaker: speaker,
}
}
func (l *SimpleListener) WhatIListened() {
(*l.speaker).Say()
}
func InitializeListener() *Listener {
wire.Build(
NewHelloSpeaker,
NewSimpleListener,
)
return nil
}
package main
func main() {
listener := InitializeListener()
(*listener).WhatIListened()
}
我试过的如下。
NewSimpleListener
返回 *Listener
, 但是 &SimpleListener
不匹配 *Listener
. wire.Bind
,但同样的错误信息。 SimpleListener
未实现 Listener
?
最佳答案
看来,wire 不够智能,无法进行自动转换。
线走
...
//change type of argument of speaker from *Speaker to Speaker
//don't want to create a new conversion method
func NewSimpleListener(speaker Speaker) *SimpleListener
...
func InitializeListener() Listener {
wire.Build(
NewHelloSpeaker, //*HelloSpeaker, HelloSpeaker doesn't implement Speaker interfaces, conversion is needed in next step
wire.Bind(new(Speaker),new(*HelloSpeaker)), //this binding can provide Speaker, not *Speaker
NewSimpleListener, //scenario as NewHelloSpeaker
//provide Listener, an extra method is needed if *Listener is wanted.
wire.Bind(new(Listener), new(*SimpleListener)),
)
return nil
}
main.go...
listener := InitializeListener()
listener.WhatIListened()
...
关于go - 为什么wire不能生成wire_gen.go?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59568031/