简体   繁体   中英

Why wire can't generate wire_gen.go?

I am trying to use google/wire for dependency injection.
When I use wire check command in terminal, it's shows no provider found for *my_go_app.Listener, output of injector .

  • wire.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()
}

What I tried is below.

  • NewSimpleListener return *Listener , but &SimpleListener not match *Listener .
  • Use wire.Bind , but same error message.

SimpleListener not implements Listener ?

It seems that wire is not smart enough to do automatic conversion.

wire.go

   ...
//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()
...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM