zoukankan      html  css  js  c++  java
  • 使用google wire解决依赖注入

    使用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能够让手写依赖关系变得简单,而且相当直观,值得推荐使用。

    [参考资料]

  • 相关阅读:
    Hive安装
    hbase安装
    Spring boot 出现的时间
    RESTful Web API 实践
    Java的进阶之道
    Spring boot 注解简单备忘
    使用 xshell 登录 Windows 的 linux 子系统
    Nginx 实用配置
    跟着大彬读源码
    跟着大彬读源码
  • 原文地址:https://www.cnblogs.com/xiaohunshi/p/10364411.html
Copyright © 2011-2022 走看看