当前位置: 移动技术网 > IT编程>脚本编程>Go语言 > 使用google wire解决依赖注入

使用google wire解决依赖注入

2019年02月13日  | 移动技术网IT编程  | 我要评论
使用google wire解决依赖注入 google wire是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系。 当我们写代码的时候,都希望,类都是一个个独立的结构,互不耦合,而类之间的关系,是通过外部传递不同的依赖组件,来组装出来,生成不同的实例。 一个耦合的例子: typ ...

使用google wire解决依赖注入

google wire是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系。

当我们写代码的时候,都希望,类都是一个个独立的结构,互不耦合,而类之间的关系,是通过外部传递不同的依赖组件,来组装出来,生成不同的实例。

一个耦合的例子:

type bob struct {
    db *sql.db
}

func newbob() *bob{
    return &bob{
        db: new(mysqldb),
    }
}

在例子中,bob类会来依赖db类,而db类的生成,是通过new(mysqldb)生成的,这样就把bob和db类耦合起来了,如果要改变其他的数据库类,则需要改动bob的代码了,这样是不合理的,因为bob依赖的是db,而不是mysqldb,最好的方式,mysqldb类改动了,但bob代码不用改。

下面改一下代码,一个组装依赖的例子:

type bob struct {
    db *sql.db
}

func newbob(db *sql.db) *bob{
    return &bob{
        db: db,
    }
}

func main(){
    db := new(mysqldb)
    newbob(db)
}

在上面的例子里,原来的new(mysqldb),替换为db: db,通过参数的方式来初始化db了,而类的组装是在main函数里面实现,使用这样组装,当mysqldb改为xxdb的时候,bob的代码不用变动,代码不用变动,出问题的几率就会少,这样的组装方式,就叫依赖注入了。

一般情况下,组装类的依赖关系,都可以手写,但平时写项目的时候,类的数量,很容易会有几十个,这个时候,如果手写的话,会很啰嗦麻烦,而且要理顺好生成的顺序。

为了解决依赖组装的问题,golang有uber的dig和facebook的inject,这两个都是通过运行时注入的,使用运行时注入,会有一些问题,比如不好调试,错误提示不及时等,而wire采用不同的方式来实现,通过生成依赖注入的代码来解决问题,这样就和手写是一样的,只是减轻手写的麻烦。

wire可以通过类组装,结构体组装,还可以参数和异常返回,看看例子:

type foo struct {

}

func newfoo() *foo{
    return &foo{}
}

type bar struct {
    foo *foo
}

func newbar(foo *foo) *bar {
    return &bar{
        foo:foo,
    }
}

func (p *bar) test(){
    fmt.println("hello")
}

wire.go:

package wire

import (
    wire "github.com/google/wire"
)

type instance struct {
    foo *foo
    bar *bar
}

var superset = wire.newset(newfoo, newbar)

func initializeallinstance() *instance {
    wire.build(superset, instance{})
    return &instance{}
}

执行wire命令,会读取到wire.newset里面的providerset,通过分析各个函数的参数和返回值,来自行解决依赖,可以生成wire_gen.go:

func initializeallinstance() *instance {
    foo := newfoo()
    bar := newbar(foo)
    instance := &instance{
        foo: foo,
        bar: bar,
    }

    return instance
}

总结

通过google wire能够让手写依赖关系变得简单,而且相当直观,值得推荐使用。

[参考资料]

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网