挖坑系列之Fx初窺

2021-10-22 14:14:42 字數 2994 閱讀 3895

實現乙個可以與瀏覽器互動輸出"hello world"的web服務的典型做法是啟動乙個http服務並執行自定義的路由。以下**片段,我們通過使用go內建net/http包不需要外部依賴即可實現。

)func main()準備好上述**,我們通過終端cd到對應目錄,執行go run main.go即可發現我們的web服務已經ready。

到目前為止,我們已經完成乙個簡單的web伺服器。但是實際開發過程中我們業務往往比較複雜,我們需要手動處理大量的依賴關係,這個時候我們就需要使用fx(uber構建的依賴注入框架)。

依賴注入即使用控制反轉來解決依賴的一種軟體設計模式。依賴注入中,依賴是乙個能夠被使用的物件。注入是將依賴項傳遞給使用它的依賴物件。依賴注入是控制反轉的子集。簡單講,依賴注入是物件合成的一種模式,父物件提供了子物件所需要的所有依賴關係。

三種依賴注入:

根據uber的官方文件(是乙個go的應用框架,主要解決兩個問題:

fx使用的是構造器注入模式,現在我們把之前的web服務使用fx進行重構,看看fx如何讓依賴變容易的。強烈建議可以先閱讀下fx官方文件(

首先我們安裝下fxgo get go.uber.org/fx

初始化fx

func main()
現在我們需要通過將http serve mux加到new方法,這樣就可以將它注入到我們的http handler

func main()
更新http handler的**

func (h *handler) helloworld(w http.responsewriter, r *http.request)最後一步是啟動我們的***

)}實際開發過程中,上面的webserver顯然是不夠看。你往往需要寫大量複雜的業務邏輯,那麼為了你的業務職責單一,可復用,模組化或許是個不錯的選擇,比如你的系統中可能會抽象出日誌模組,認證模組,統計模組等等。

而fx就是基於模組化程式設計的概念設計的,當fx建立乙個新物件(物件a)時,它將查詢物件a所需要的依賴項,

舉個栗子,假如我們現在要為剛剛的webserver提供乙個日誌記錄的能力,我們可以利用zap來構建乙個日誌模組。

// providelogger to fx

func providelogger() *zap.sugaredlogger 

// module provided to fx

var module = fx.options(

fx.provide(providelogger),

)

然後更新main.go

}這樣乙個簡單的module注入就完成了,我們也可以嘗試將乙個rpc呼叫模組化 然後應用下di的思想。

依賴注入給我帶來了相當好的價值,但是也存在缺點:

依賴注入會建立需要構造詳細資訊的客戶端,當明顯的預設值可用時,這可能會很困難

依賴注入將物件的構造和行為分開,**也難以追蹤

需要更多的前期工作

本文只是簡單介紹了下fx,計畫後續有機會可以深入剖析一下,先挖個坑。。。

初窺設計模式之簡單工廠

設計模式在我看來整合了軟體設計者眾人的智慧型。我們想要利用前人智慧型設計軟體,而不是自己從頭開始摸索,那麼我們就需要站在巨人的肩膀上。設計模式便是巨人的肩膀。最近開始啃gof這些設計模式,希望通過在blog上的梳理加深自己的印象。簡單工廠模式 factory 裡的工廠其實是超級工廠。所有的建立任務都...

資料探勘系列之二 資料探勘初窺

1.why 為什麼需要資料探勘 資料庫系統經歷了如下的技術演變 資料收集和資料庫建立,資料管理 dbms,包括資料儲存和檢索,聯機事務處理oltp 以及高階資料分析 涉及資料倉儲和資料探勘 當前常見的資料集形式為多個異構資料來源在單個站點以統一的模式組織的儲存庫,即資料倉儲。資料倉儲技術包括資料清理...

JS 初窺之閉包的理解

閉包包含自由 未繫結到特定物件 變數,這些變數不是在這個 塊內或者任何 全域性上下文中定義的,而是在定義 塊的環境中定義 區域性變數 閉包 一詞 於以下兩者的結合 要執行的 塊 由於自由變數被包含在 塊中,這些自由變數以及它們引用的物件沒有被釋放 和為 自由變數 提供繫結的計算環境 作用域 閉包是乙...