使用google wire解决依赖注入
google wire是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系。
实例
package main
import (
"fmt"
"time"
)
// 采集函数
type F func()
// 采集对象
type Worker struct {
Interval time.Duration
Work F
}
//采集模块
type Beater struct {
Name string
Version string
Worker Worker
}
//NewFunc 初始化一个采集函数
func NewFunc() F {
return func() {
fmt.Println("working...")
}
}
//NewWorker 根据具体的采集函数初始化一个采集对象
func NewWorker(f F) Worker {
return Worker{
60 * time.Second,
f,
}
}
//NewBeater 根据采集对象初始化一个采集模块
func NewBeater(w Worker) Beater {
return Beater{
"Beater-" + time.Now().String(),
"1.0.0",
w,
}
}
//Start 方法启动该模块下的采集事件
func (b Beater) Start() {
b.Worker.Work()
}
//手动注入依赖方式
func main() {
f := NewFunc()
w := NewWorker(f)
b := NewBeater(w)
b.Start()
}
上面代码展示了一个数据采集的初始化和运行,初始化需要繁多的步骤.
使用wire自动注入依赖
先把我们的main函数简化一下
func main() {
b := SuperNewBeat()
b.Start()
}
SuperNewBeat
这个函数我们在新创建的wire.go文件中定义
package main
import "github.com/google/wire"
func SuperNewBeat() Beater {
wire.Build(NewBeater, NewWorker, NewFunc)
return Beater{}
}
向wire.Build
中提供生成Beater对象所有的初始化函数,它自动帮我们链接所有的必要步骤,执行wire
命令生成wire_gen.go
文件
//安装wire
go get GitHub.com/google/wire/cmd/wire
// Code generated by Wire. DO NOT EDIT.
//go:generate wire
//+build !wireinject
package main
// Injectors from wire.go:
func SuperNewBeat() Beater {
f := NewFunc()
worker := NewWorker(f)
beater := NewBeater(worker)
return beater
}
//wire帮我们链接了所有的依赖
当然初始化过程中可能因为,链接,解析配置等原因失败.wire也可以检测到
我们试图让NewBeater
多返回一个error类型
func NewBeater(w Worker) (Beater, error) {
同时更新SuperNewBeat函数
func SuperNewBeat() (Beater, error) {
wire.Build(NewBeater, NewWorker, NewFunc)
return Beater{}, nil
}
再次执行wire
// Code generated by Wire. DO NOT EDIT.
//go:generate wire
//+build !wireinject
package main
// Injectors from wire.go:
func SuperNewBeat() (Beater, error) {
f := NewFunc()
worker := NewWorker(f)
beater, err := NewBeater(worker)
if err != nil {
return Beater{}, err
}
return beater, nil
}
新的SuperNewBeat
函数同样适配了改动