W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Wire 是一個靈活的依賴注入工具,通過自動生成代碼的方式在編譯期完成依賴注入。
在各個組件之間的依賴關(guān)系中,通常鼓勵顯式初始化,而不是全局變量傳遞。
所以通過 Wire 進行初始化代碼,可以很好地解決組件之間的耦合,以及提高代碼維護性。
# 導(dǎo)入到項目中
go get -u github.com/google/wire
# 安裝命令
go install github.com/google/wire/cmd/wire
Wire 具有兩個基本概念:Provider 和 Injector。
Provider 是一個普通的 Go Func ,這個方法也可以接收其它 Provider 的返回值,從而形成了依賴注入;
// 提供一個配置文件(也可能是配置文件)
func NewConfig() *conf.Data {...}
// 提供數(shù)據(jù)組件,依賴了數(shù)據(jù)配置(初始化 Database、Cache 等)
func NewData(c *conf.Data) (*Data, error) {...}
// 提供持久化組件,依賴數(shù)據(jù)組件(實現(xiàn) CURD 持久化層)
func NewUserRepo(d *data.Data) (*UserRepo, error) {...}
在 Kratos 中,主要分為 server、service、biz、data 服務(wù)模塊,會通過 Wire 進行模塊順序的初始化;
在每個模塊中,只需要一個 ProviderSet 提供者集合,就可以在 wire 中進行依賴注入;
并且我們在每個組件提供入口即可,不需要其它依賴,例如:
-data
--data.go // var ProviderSet = wire.NewSet(NewData, NewGreeterRepo)
--greeter.go // func NewGreeterRepo(data *Data, logger log.Logger) biz.GreeterRepo {...}
然后通過 wire.go 中定義所有 ProviderSet 可以完成依賴注入配置。
通過 wire 初始化組件,需要定義對應(yīng)的 wire.go,以及 kratos application 用于啟動管理。
// 應(yīng)用程序入口
cmd
-main.go
-wire.go
-wire_gen.go
// main.go 創(chuàng)建 kratos 應(yīng)用生命周期管理
func newApp(logger log.Logger, hs *http.Server, gs *grpc.Server, greeter *service.GreeterService) *kratos.App {
pb.RegisterGreeterServer(gs, greeter)
pb.RegisterGreeterHTTPServer(hs, greeter)
return kratos.New(
kratos.Name(Name),
kratos.Version(Version),
kratos.Logger(logger),
kratos.Server(
hs,
gs,
),
)
}
// wire.go 初始化模塊
func initApp(*conf.Server, *conf.Data, log.Logger) (*kratos.App, error) {
// 構(gòu)建所有模塊中的 ProviderSet,用于生成 wire_gen.go 自動依賴注入文件
panic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))
}
在項目的 main 目錄中,運行 wire 進行生成編譯期依賴注入代碼:
wire
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: