安装工具:
go get github.com/google/wire/cmd/wire
示例:
type Monster struct {
Name string
}
func NewMonster() Monster {
return Monster{Name: "kitty"}
}
type Player struct {
Name string
}
func NewPlayer(name string) Player {
return Player{Name: name}
}
type Mission struct {
Player Player
Monster Monster
}
func NewMission(p Player, m Monster) Mission {
return Mission{p, m}
}
func (m Mission) Start() {
fmt.Printf("%s defeats %s, world peace!\n", m.Player.Name, m.Monster.Name)
}
正常使用:
monster := NewMonster()
player := NewPlayer("dj")
mission := NewMission(player, monster)
mission.Start()
使用wire:
新建wire.go
//+build wireinject
package main
import "github.com/google/wire"
func InitMission(name string) Mission {
wire.Build(NewMonster, NewPlayer, NewMission)
return Mission{}
}
注意://+build wireinject 该注释可以让golang编译时忽略此文件,从而不会导致与wire_gen.go中生成的方法重名。另外,//+build wireinjec应该与package main间有空行。
执行: wire
生成 wire_gen.go,
调用
player := InitMission("dj")
player.Start()
基础概念
wire有两个基础概念,Provider(构造器)和Injector(注入器)。Provider实际上就是创建函数,大家意会一下。我们上面InitMission就是Injector。每个注入器实际上就是一个对象的创建和初始化函数。在这个函数中,我们只需要告诉wire要创建什么类型的对象,这个类型的依赖,wire工具会为我们生成一个函数完成对象的创建和初始化工作。
实际上,wire在生成代码时,构造器需要的参数(或者叫依赖)会从参数中查找或通过其它构造器生成。
如果参数或构造器生成的对象有类型相同的情况,运行wire工具时会报错。