使用google wire注入依赖

使用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函数同样适配了改动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值