亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)

需要依賴注入時(shí),Go有什么實(shí)現(xiàn)方案?本文詳細(xì)介紹了使用google/wire庫(kù)實(shí)現(xiàn)依賴注入的方法。

google/wire 是 Go 語(yǔ)言的編譯時(shí)依賴注入框架,與 Spring IoC 一樣,wire 的目的也是讓開發(fā)者從對(duì)項(xiàng)目中大量依賴的創(chuàng)建和管理中解脫出來(lái),但兩者在實(shí)現(xiàn)方式上有著很大的不同。

Go 中的依賴注入

在 Go 中,我們通常采取在構(gòu)造函數(shù)中傳入依賴的方式創(chuàng)建對(duì)象:

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖

這在小規(guī)模項(xiàng)目中效果很好,但當(dāng)項(xiàng)目規(guī)模變大時(shí),單個(gè)對(duì)象的創(chuàng)建往往需要多個(gè)依賴,而這些依賴通常還有它自己的依賴,這就導(dǎo)致對(duì)象的創(chuàng)建變得繁瑣,容易出錯(cuò)。

wire 如何完成依賴注入

在開發(fā)中,我們創(chuàng)建對(duì)象的過(guò)程可以分為兩步:

  1. 定義結(jié)構(gòu)體的構(gòu)造函數(shù)
go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖1

2.調(diào)用結(jié)構(gòu)體的構(gòu)造函數(shù)進(jìn)行實(shí)例化

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖2

第一步我們聲明了構(gòu)造結(jié)構(gòu)體需要的依賴,而 wire 做的,就是?幫我們“寫”好第二步的代碼。

依賴聲明

為了生成第二步中的代碼,我們首先需要將所有的構(gòu)造函數(shù)(準(zhǔn)確的說(shuō)是所有需要注入的依賴)進(jìn)行聲明并傳遞給?wire.Build?方法:

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖3

setup?函數(shù)的內(nèi)容最終會(huì)被 wire 用下面的實(shí)現(xiàn)替換(接下來(lái)會(huì)進(jìn)行說(shuō)明):

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖4

可以看到上面 wire 為我們“寫”好的代碼其實(shí)跟我們自己將會(huì)寫的代碼是一樣的,可以很容易的讀懂。但隨著依賴增多,這樣的代碼就會(huì)增加,想象一下,如果項(xiàng)目中有上百個(gè)依賴,那么就會(huì)有上百行的 New…(…), if err != nil {…}?代碼。

使用 go generate 生成依賴注入代碼

wire 就是做了這樣一件事:幫我們生成所有需要的對(duì)象創(chuàng)建代碼,開發(fā)時(shí)我們只需要在結(jié)構(gòu)體的構(gòu)造函數(shù)中聲明自己需要什么。

wire 在實(shí)際項(xiàng)目中的使用步驟:

  1. 通過(guò)?wire.Bind?方法進(jìn)行依賴聲明,假設(shè)這部分代碼放在?inject.go?文件中
  2. 使用 go generate http://c.biancheng.net/view/4442.html 命令生成代碼

go generate?需要通過(guò)?//go:generate?注釋的方式使用,創(chuàng)建?wire_gen.go?文件并添加該注釋:

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖5
  1. 在項(xiàng)目目錄下執(zhí)行 go generate 命令。

運(yùn)行該命令時(shí),它將掃描與當(dāng)前包相關(guān)的源代碼文件,找出所有包含?//go:generate 的特殊注釋,提取并執(zhí)行該特殊注釋后面的命令。

至此,你就可以看到 wire_gen.go 里已經(jīng)生成好 func setup(ctx context.Context) (sv *server.Server, clean func(), err error)?方法,方法體為依賴注入(對(duì)象創(chuàng)建)代碼。

  1. 最后一步,在 main 方法中調(diào)用?setup?方法(這里假設(shè)我們的項(xiàng)目是一個(gè)提供 RESTful 接口的 HTTP 服務(wù))
go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖6

需要注意的是,如果 inject.go 和 wire_gen.go 在同一個(gè) package 下,那此時(shí) IDE 會(huì)提示語(yǔ)法錯(cuò)誤,因?yàn)閮蓚€(gè)文件下存在方法簽名一樣的兩個(gè)方法。此時(shí)可以使用 //+build go build 構(gòu)建約束對(duì)其中一個(gè)文件進(jìn)行排除。

首先在?inject.go?中加入如下的構(gòu)建標(biāo)簽:

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖7

然后在 wire_gen.go 中加入構(gòu)建約束使 go build 時(shí)排除帶 wireinject 標(biāo)簽的文件:

go也能依賴注入?進(jìn)來(lái)細(xì)說(shuō)插圖8

使用 wire.Bind, wire.Value 等方法聲明和組織依賴

wire 在 go generate 掃描代碼時(shí)從 wire.Bind 中提取項(xiàng)目依賴關(guān)系并為我們生成依賴注入代碼,那我們要怎樣將依賴關(guān)系更高效,清晰的“告知”給 wire 呢?

wire 提供了幾個(gè)函數(shù)幫助我們組織和聲明項(xiàng)目中的依賴關(guān)系:

  • wire.Bind: 將接口和其實(shí)現(xiàn)進(jìn)行綁定
  • wire.Value: 將值(實(shí)例)包裝為依賴

    原文:https://mp.weixin.qq.com/s/plzFgg7nUthKMMgh56e-TA

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!