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