使用google wire解決依賴注入

使用google wire解決依賴注入

google wire是golang的一個依賴注入解決的工具,這個工具可以自動生成類的依賴關係。git

當咱們寫代碼的時候,都但願,類都是一個個獨立的結構,互不耦合,而類之間的關係,是經過外部傳遞不一樣的依賴組件,來組裝出來,生成不一樣的實例。github

一個耦合的例子: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代碼不用改。sql

下面改一下代碼,一個組裝依賴的例子:數據庫

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的代碼不用變更,代碼不用變更,出問題的概率就會少,這樣的組裝方式,就叫依賴注入了。ide

通常狀況下,組裝類的依賴關係,均可以手寫,但平時寫項目的時候,類的數量,很容易會有幾十個,這個時候,若是手寫的話,會很囉嗦麻煩,並且要理順好生成的順序。函數

爲了解決依賴組裝的問題,golang有uber的dig和Facebook的inject,這兩個都是經過運行時注入的,使用運行時注入,會有一些問題,好比很差調試,錯誤提示不及時等,而wire採用不一樣的方式來實現,經過生成依賴注入的代碼來解決問題,這樣就和手寫是同樣的,只是減輕手寫的麻煩。工具

wire能夠經過類組裝,結構體組裝,還能夠參數和異常返回,看看例子:ui

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:google

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可以讓手寫依賴關係變得簡單,並且至關直觀,值得推薦使用。

[參考資料]

相關文章
相關標籤/搜索