安装工具:

go get github.com/google/wire/cmd/wire

示例:

  1. type Monster struct {
  2. Name string
  3. }
  4. func NewMonster() Monster {
  5. return Monster{Name: "kitty"}
  6. }
  7. type Player struct {
  8. Name string
  9. }
  10. func NewPlayer(name string) Player {
  11. return Player{Name: name}
  12. }
  13. type Mission struct {
  14. Player Player
  15. Monster Monster
  16. }
  17. func NewMission(p Player, m Monster) Mission {
  18. return Mission{p, m}
  19. }
  20. func (m Mission) Start() {
  21. fmt.Printf("%s defeats %s, world peace!\n", m.Player.Name, m.Monster.Name)
  22. }

正常使用:

  1. monster := NewMonster()
  2. player := NewPlayer("dj")
  3. mission := NewMission(player, monster)
  4. mission.Start()

使用wire:
新建wire.go

  1. //+build wireinject
  2. package main
  3. import "github.com/google/wire"
  4. func InitMission(name string) Mission {
  5. wire.Build(NewMonster, NewPlayer, NewMission)
  6. return Mission{}
  7. }

注意://+build wireinject 该注释可以让golang编译时忽略此文件,从而不会导致与wire_gen.go中生成的方法重名。另外,//+build wireinjec应该与package main间有空行。

执行: wire
生成 wire_gen.go,

调用

  1. player := InitMission("dj")
  2. player.Start()

基础概念


wire有两个基础概念,Provider(构造器)和Injector(注入器)。Provider实际上就是创建函数,大家意会一下。我们上面InitMission就是Injector。每个注入器实际上就是一个对象的创建和初始化函数。在这个函数中,我们只需要告诉wire要创建什么类型的对象,这个类型的依赖,wire工具会为我们生成一个函数完成对象的创建和初始化工作。

实际上,wire在生成代码时,构造器需要的参数(或者叫依赖)会从参数中查找或通过其它构造器生成。

如果参数或构造器生成的对象有类型相同的情况,运行wire工具时会报错。