使用 google/wire 对 Go 项目进行依赖注入


本文摘自网络,作者,侵删。

google/wire 是 Go 语言的编译时依赖注入框架,与 Spring IoC 一样,wire 的目的也是让开发者从对项目中大量依赖的创建和管理中解脱出来,但两者在实现方式上有着很大的不同。

Go 中的依赖注入

在 Go 中,我们通常采取在构造函数中传入依赖的方式创建对象:

func main() {
    NewUserStore(conf.Load(),db.InitMySQL())
}

func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore, error) {...}

这在小规模项目中效果很好,但当项目规模变大时,单个对象的创建往往需要多个依赖,而这些依赖通常还有它自己的依赖,这就导致对象的创建变得繁琐,容易出错。

wire 如何完成依赖注入

在开发中,我们创建对象的过程可以分为两步:

  1. 定义结构体的构造函数
func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore, error) {...}
  1. 调用结构体的构造函数进行实例化
NewUserStore(conf.Load(),db.InitMySQL())

第一步我们声明了构造结构体需要的依赖,而 wire 做的,就是 帮我们“写”好第二步的代码

依赖声明

为了生成第二步中的代码,我们首先需要将所有的构造函数(准确的说是所有需要注入的依赖)进行声明并传递给 wire.Build 方法:

func setup(ctx context.Context) (sv *server.Server, clean func(), err error) {
    wire.Build(
        conf.Load,
        db.InitMySQL,
        userstore.NewUserStore,
    )
    return nil, nil, nil
}

setup 函数的内容最终会被 wire 用下面的实现替换(接下来会进行说明):

func setup(ctx context.Context) (sv *server.Server, clean func(), err error) {
    config := conf.Load()
    engine := db.InitMySQL()
    userstoreHandler, clean1, err := userstore.NewUserStore(config,engine)
    if err != nil {
        clean()
        return nil, nil, err
    }
    sv := server.New(userstoreHandler)
    return sv, func() { clean1() }, nil
}

可以看到上面 wire 为我们“写”好的代码其实跟我们自己将会写的代码是一样的,可以很容易的读懂。但随着依赖增多,这样的代码就会增加,想象一下,如果项目中有上百个依赖,那么就会有上百行的 New...(...), if err != nil {...} 代码。

使用 go generate 生成依赖注入代码

wire 就是做了这样一件事:帮我们生成所有需要的对象创建代码,开发时我们只需要在结构体的构造函数中声明自己需要什么。

阅读剩余部分

相关阅读 >>

Golang- Go语言学习笔记之定义变量

生产环境遇到一个 Go 问题,整组人都懵逼了...

Golang如何释放map内存?

26 Goroutine channel实现并发和并行(三)

Golang zip中文乱码怎么解决

Go学习六·集合(map)

devops ci/cd 分析(三)之k8s yaml模版配置详解

Golang怎么编写一个window定时关机

手撸Golang Go与微服务 saga模式之6

关于Golang Gopath的新用法

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...