go語言實現(xiàn)依賴注入的示例代碼
依賴注入(Dependency injection)
依賴注入和控制反轉(zhuǎn)恰恰相反,它是一種具體的編碼技巧。我們不通過 new 的方式在類內(nèi)部創(chuàng)建依賴類的對象,而是將依賴的類對象在外部創(chuàng)建好之后,通過構(gòu)造函數(shù)、函數(shù)參數(shù)等方式傳遞(或注入)給類來使用。
DI(依賴性注入)是一種技術(shù),當你的模塊間接地接受依賴性。他們不知道依賴的實現(xiàn),只知道接口。
我們?yōu)槭裁葱枰?/h2>
DI 可以幫助我們編寫低耦合的代碼。這意味著你將能夠隨時交換你的代碼,并有助于重用它們的一些部分。
在寫單元測試時,使用 mock 方式注入是一個非常好的實踐。
參考代碼
我們有一個小小的項目:main.go 和 兩個服務–日志和緩存
├───cmd │ └───main.go └───services ├───logger │ └───logger.go └───cache └───cache.go
它們是如何工作的?我們有一個緩存服務,如果你想把一些東西存儲在像Redis這樣的快速存儲中,就可以使用它。
// cache.go import ( "fmt" "sync" ) // 將被注入的記錄器服務的接口,用小寫的方式來隱藏出口,是一個好的方式。 type logger interface { Error(error) Info(string) } type Cache struct { logger logger m *sync.Map } // NewCache 我們服務的構(gòu)造函數(shù),接收將被注入的服務的接口(我們可以注入幾個服務),并返回結(jié)構(gòu)(緩存的實例)。 func NewCache(logger logger) *Cache { return &Cache{ logger: logger, m: new(sync.Map), } } func (r *Cache) Get(key string) (string, error) { rawValue, ok := r.m.Load(key) if !ok { err := fmt.Errorf("not found: %s", key) r.logger.Error(err) return "", err } return rawValue.(string), nil } func (r *Cache) Set(key string, data []byte) { r.m.Store(key, data) r.logger.Info(fmt.Sprintf("store key: %s", key)) }
日志服務用來對日志的持久化存儲以及分析
// logger.go import "fmt" type sentryClient interface { sendMessage(interface{}) } type NormalSentryClient struct{} func (s *NormalSentryClient) sendMessage(i interface{}) { fmt.Printf("send message %+v to sentry\n", i) } type Logger struct { sentry sentryClient } func NewLogger(sentryClient sentryClient) *Logger { return &Logger{ sentry: sentryClient, } } // 我們看到這里有四個方法,但是 cache 對象只能看到兩個:Error 以及 Info func (l *Logger) Error(e error) { fmt.Printf("[ERROR] %+v\n", e) } func (l *Logger) Info(msg string) { fmt.Printf("[INFO] %s\n", msg) } func (l *Logger) Debug(msg string) { fmt.Printf("[DEBUG] %s\n", msg) } func (l *Logger) Log(msg string) { fmt.Printf("[LOG] %s\n", msg) }
// main.go func main() { // 注冊服務 sentryService := new(logger.NormalSentryClient) loggerService := logger.NewLogger(sentryService) cacheService := cache.NewCache(loggerService) cacheService.Set("test", []byte("test")) cacheService.Get("test1") }
輸出:
[INFO] store key: test
[ERROR] not found: test1
golang DI 開源庫
- inject:基于反射,運行時注入。但是已經(jīng)不維護了。
- wire:AST,編譯期注入。
- dig,F(xiàn)x:基于反射,運行時注入。
以上就是go語言實現(xiàn)依賴注入的示例代碼的詳細內(nèi)容,更多關(guān)于go實現(xiàn)依賴注入的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Mac中搭建go語言開發(fā)環(huán)境的操作步驟
go語言在開發(fā)效率和運行效率中的優(yōu)勢讓很多人青睞,所以有傾向打算轉(zhuǎn)向go語言的開發(fā)。下面介紹在Mac中g(shù)olang的開發(fā)環(huán)境配置。有需要的可以參考借鑒。2016-08-08golang并發(fā)工具MapReduce降低服務響應時間
這篇文章主要為大家介紹了golang并發(fā)使用MapReduce降低服務響應時間實踐使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務器操作
這篇文章主要介紹了go語言實現(xiàn)sftp包上傳文件和文件夾到遠程服務器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解
這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08