真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言依賴注入指的是什么

本篇內(nèi)容介紹了“go語(yǔ)言依賴注入指的是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站制作、岢嵐網(wǎng)絡(luò)推廣、小程序定制開(kāi)發(fā)、岢嵐網(wǎng)絡(luò)營(yíng)銷、岢嵐企業(yè)策劃、岢嵐品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供岢嵐建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

在go語(yǔ)言中,依賴注入(DI)是一種解耦組件之間依賴關(guān)系的設(shè)計(jì)模式;在需要的時(shí)候,不同組件之間可以通過(guò)一個(gè)統(tǒng)一的界面獲取其它組件中的對(duì)象和狀態(tài)。依賴注入的好處是解耦;而解耦又能帶來(lái)更多的好處:代碼擴(kuò)展性增強(qiáng),代碼的可維護(hù)性增強(qiáng),更容易進(jìn)行單元測(cè)試等等。

依賴注入是什么?

第一次聽(tīng)到這個(gè)詞的時(shí)候我是一臉懵逼的,很拗口有沒(méi)有,可能很多學(xué)過(guò)spring的同學(xué)覺(jué)得這是很基礎(chǔ)很好理解的知識(shí),但因?yàn)槲抑皼](méi)學(xué)過(guò)Java和spring,所以第一次接觸這個(gè)詞的時(shí)候是很懵的。

依賴注入,英文名dependency injection,簡(jiǎn)稱DI。依賴兩個(gè)字很好理解,在軟件設(shè)計(jì)上,從架構(gòu)模塊到函數(shù)方法都存在大大小小的依賴關(guān)系。

比如說(shuō)在new A 之前需要先new B ,A依賴于B,這時(shí)候我們就可以說(shuō)B是A的依賴,A控制B,AB之間存在著耦合的關(guān)系,而代碼設(shè)計(jì)思想是最好可以做到松耦合。如果某一天B需要改造那么A也需要跟著改造。這是一個(gè)依賴你可以覺(jué)得沒(méi)問(wèn)題,但如果是A->B->C->D->E->F之間存在一連串的依賴關(guān)系,那么改造起來(lái)就會(huì)十分麻煩。

go語(yǔ)言依賴注入指的是什么

這個(gè)時(shí)候就需要一種東西來(lái)解開(kāi)他們之間的強(qiáng)耦合,怎么解耦呢,只能借助第三方力量了,我們把A對(duì)B的控制權(quán)交給第三方,這種思想就稱為控制反轉(zhuǎn)(IOC Inversion Of Control),這個(gè)第三方稱為IOC容器。而IOC容器要做的事情就是new一個(gè)B出來(lái),然后把這個(gè)B的實(shí)例注入到A里面去,然后A就可以正常的使用基于B的方法了,這個(gè)過(guò)程被稱為依賴項(xiàng)注入,而基于IOC的這種方法就叫做依賴注入。

簡(jiǎn)單來(lái)說(shuō),依賴注入(DI)是一種解耦組件之間依賴關(guān)系的設(shè)計(jì)模式。在需要的時(shí)候,不同組件之間可以通過(guò)一個(gè)統(tǒng)一的界面獲取其它組件中的對(duì)象和狀態(tài)。Go語(yǔ)言的接口設(shè)計(jì),避免了很多需要使用第三方依賴注入框架的情況(比如Java,等等)。我們的注入方案只提供非常少的類似Dager或Guice中的注入方案,而專注于盡量避免手動(dòng)去配置對(duì)象和組件之間的依賴關(guān)系。

依賴注入的好處

明白了依賴注入的思想,應(yīng)該也就明白了其帶來(lái)的最大好處——解耦。

而解耦又能帶來(lái)更多的好處:代碼擴(kuò)展性增強(qiáng),代碼的可維護(hù)性增強(qiáng),更容易進(jìn)行單元測(cè)試等等。

那么依賴注入如何實(shí)現(xiàn)呢?

Java中有以下幾種方式:

  • setter方法注入:實(shí)現(xiàn)特定屬性的public set方法,來(lái)讓外部容器調(diào)用傳入所依賴類型的對(duì)象。

  • 基于接口的注入:實(shí)現(xiàn)特定接口以供外部容器注入所依賴類型的對(duì)象。

  • 基于構(gòu)造函數(shù)的注入:實(shí)現(xiàn)特定參數(shù)的構(gòu)造函數(shù),在新建對(duì)象時(shí)傳入所依賴類型的對(duì)象。

  • 基于注解的注入:在代碼里加上特定的關(guān)鍵字實(shí)現(xiàn)注入。

注解是最常見(jiàn)的方式,它像注釋一樣不被當(dāng)做代碼來(lái)執(zhí)行,而是專門供別人閱讀。但注釋的讀者完全是人類,而注解的主要讀者除了人類之外還有框架或預(yù)編譯器。

Go依賴注入-wire

wire就是一種基于注解的依賴注入方式。wire是 Google 開(kāi)源的一個(gè)依賴注入工具,我們只需要在一個(gè)特殊的go文件中告訴wire類型之間的依賴關(guān)系,它會(huì)自動(dòng)幫我們生成代碼,幫助我們創(chuàng)建指定類型的對(duì)象,并組裝它的依賴。

wire有兩個(gè)基礎(chǔ)概念,Provider(構(gòu)造器)和Injector(注入器)。

通過(guò)提供provider函數(shù),讓wire知道如何產(chǎn)生這些依賴對(duì)象。wire根據(jù)我們定義的injector函數(shù)簽名,生成完整的injector函數(shù),injector函數(shù)是最終我們需要的函數(shù),它將按依賴順序調(diào)用provider。

wire的要求很簡(jiǎn)單,新建一個(gè)wire.go文件(文件名可以隨意),創(chuàng)建我們的初始化函數(shù)。比如,我們要?jiǎng)?chuàng)建并初始化一個(gè)Mission對(duì)象,我們就可以這樣:

//+build wireinject

package main

import "github.com/google/wire"

func InitMission(name string) Mission {
  wire.Build(NewMonster, NewPlayer, NewMission)
  return Mission{}
}

可以看到第一行的注解:+build wireinject,表示這是一個(gè)注入器。+build其實(shí)是 Go 語(yǔ)言的一個(gè)特性。類似 C/C++ 的條件編譯,在執(zhí)行go build時(shí)可傳入一些選項(xiàng),根據(jù)這個(gè)選項(xiàng)決定某些文件是否編譯。wire工具只會(huì)處理有wireinject的文件,所以我們的wire.go文件要加上這個(gè)。

在函數(shù)中,我們調(diào)用wire.Build()將創(chuàng)建Mission所依賴的類型的構(gòu)造器傳進(jìn)去。例如,需要調(diào)用NewMission()創(chuàng)建Mission類型,NewMission()接受兩個(gè)參數(shù)一個(gè)Monster類型,一個(gè)Player類型。Monster類型對(duì)象需要調(diào)用NewMonster()創(chuàng)建,Player類型對(duì)象需要調(diào)用NewPlayer()創(chuàng)建。所以NewMonster()NewPlayer()我們也需要傳給wire。

寫(xiě)完wire.go文件之后執(zhí)行wire命令,就會(huì)自動(dòng)生成一個(gè)wire_gen.go文件。

// Code generated by Wire. DO NOT EDIT.

//go:generate wire
//+build !wireinject

package main

// Injectors from wire.go:

func InitMission(name string) Mission {
  player := NewPlayer(name)
  monster := NewMonster()
  mission := NewMission(player, monster)
  return mission
}

可以看到wire自動(dòng)幫我們生成了InitMission方法,此方法中依次初始化了player,monster和mission。之后在我們的main函數(shù)中就只需調(diào)用這個(gè)InitMission即可。

func main() {
  mission := InitMission("dj")

  mission.Start()
}

而在沒(méi)用依賴注入之前,我們的代碼是這樣的:

func main() {
  monster := NewMonster()
  player := NewPlayer("dj")
  mission := NewMission(player, monster)

  mission.Start()
}

是不是簡(jiǎn)潔了很多。這里只有三個(gè)對(duì)象的初始化,如果是更多可能才會(huì)意識(shí)到依賴注入的好處。

比如:

wire.go文件:
// +build wireinject
// The build tag makes sure the stub is not built in the final build.

package di

import (
	"github.com/google/wire"
)

//go:generate kratos t wire
func InitApp() (*App, func(), error) {
	panic(wire.Build(dao.Provider, service.Provider, http.New, grpc.New, NewApp))
}

實(shí)現(xiàn)文件:
//dao
var Provider = wire.NewSet(New, NewDB, Newredis)
//service
var Provider = wire.NewSet(New, wire.Bind(new(pb.Server), new(*Service)))


生成的wire_gen.go 文件:
func InitApp() (*App, func(), error) {
	redis, cleanup, err := dao.NewRedis()
	if err != nil {
		return nil, nil, err
	}
	db, cleanup2, err := dao.NewDB()
	if err != nil {
		cleanup()
		return nil, nil, err
	}
	daoDao, cleanup3, err := dao.New(redis, db)
	if err != nil {
		cleanup2()
		cleanup()
		return nil, nil, err
	}
	serviceService, cleanup4, err := service.New(daoDao)
	if err != nil {
		cleanup3()
		cleanup2()
		cleanup()
		return nil, nil, err
	}
	engine, err := http.New(serviceService)
	if err != nil {
		cleanup4()
		cleanup3()
		cleanup2()
		cleanup()
		return nil, nil, err
	}
	server, err := grpc.New(serviceService)
	if err != nil {
		cleanup4()
		cleanup3()
		cleanup2()
		cleanup()
		return nil, nil, err
	}
	app, cleanup5, err := NewApp(serviceService, engine, server)
	if err != nil {
		cleanup4()
		cleanup3()
		cleanup2()
		cleanup()
		return nil, nil, err
	}
	return app, func() {
		cleanup5()
		cleanup4()
		cleanup3()
		cleanup2()
		cleanup()
	}, nil
}

所以,依賴注入到底是什么?

封裝解耦罷了。

“go語(yǔ)言依賴注入指的是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


文章名稱:go語(yǔ)言依賴注入指的是什么
網(wǎng)頁(yè)地址:http://weahome.cn/article/johedh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部