go - 为什么wire不能生成wire_gen.go?

标签 go dependency-injection

我正在尝试使用 google/wire 进行依赖注入(inject)。
当我使用 wire check终端中的命令,它显示no provider found for *my_go_app.Listener, output of injector .

  • 电线.go

  • // +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
    }
    
    
  • main.go

  • 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/

    相关文章:

    具有许多其他 View 模型依赖项的 Wpf 主视图模型

    http - 如何获取刚在Go中设置的HTTP header 的字符串值?

    go - 为什么不使用 golang WSGI 实现

    http - 向 Struct 添加一些日期,然后将其放入 go 模板中

    ssl - 如何在 Go 中建立到 memsql 的基于 ssl 的 tcp 连接

    docker-compose 找不到包

    java - 如何使用 Google Guice 创建需要参数的对象?

    wpf - MVVM - View 真的需要有一个默认的构造函数吗?

    c# - Dotnet Core 是否实现组合根发现?

    c# - 使用 SignalR 注入(inject) IPrincipal