Kratos Wire 依賴注入

2022-04-25 17:45 更新

Wire 依賴注入

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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號