日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Go 語言中怎么使用依賴注入?

來源: 責編: 時間:2024-04-02 17:24:08 227觀看
導讀1 、介紹在 Go 語言項目開發中,我們處理組件層級之間的依賴關系時,通常我們會先在依賴層級的代碼中實例化被依賴層級,然后調用它的方法,即依賴方需要主動獲取被依賴方。但是,當被依賴層級的代碼發生變化時,依賴層級的代碼也

1 、介紹

在 Go 語言項目開發中,我們處理組件層級之間的依賴關系時,通常我們會先在依賴層級的代碼中實例化被依賴層級,然后調用它的方法,即依賴方需要主動獲取被依賴方。zQG28資訊網——每日最新資訊28at.com

但是,當被依賴層級的代碼發生變化時,依賴層級的代碼也需要修改,耦合性比較高,代碼不方便擴展。zQG28資訊網——每日最新資訊28at.com

所謂依賴注入,即依賴方不再需要主動獲取被依賴方,而是被依賴方主動傳遞給依賴方。zQG28資訊網——每日最新資訊28at.com

本文我們介紹 Go 語言怎么使用依賴注入。zQG28資訊網——每日最新資訊28at.com

2 、Go 語言使用依賴注入

在 Go 語言中,怎么使用依賴注入呢?我準備以 clean arch 架構的代碼講解。zQG28資訊網——每日最新資訊28at.com

推薦讀者朋友們先閱讀我之前寫的一遍文章 「Go 語言整潔架構實踐」。zQG28資訊網——每日最新資訊28at.com

參照 Bob 大叔的一篇關于整潔架構的文章 The Clean Architecture,我們分 4 個層級:zQG28資訊網——每日最新資訊28at.com

  • Models
  • Repository
  • Usecase
  • Delivery

限于篇幅,本文主要介紹在 Go 語言中使用構造函數的方式實現依賴注入,讀者朋友們可以在留言區分享其它實現方式。zQG28資訊網——每日最新資訊28at.com

示例代碼:zQG28資訊網——每日最新資訊28at.com

// Models 層type Todolist struct { Id      int64  `json:"id"` Title   string `json:"title"` Status  int    `json:"status"` Created int    `json:"created"` Updated int    `json:"updated"`}type TodoListRepository interface { Create(ctx context.Context, t *Todolist) (err error)}type TodoListUsecase interface { Create(context.Context, *Todolist) (err error)}// Repository 層type mysqlTodoListRepository struct { Conn *sql.DB}func NewMysqlTodoListRepository(Conn *sql.DB) models.TodoListRepository { return &mysqlTodoListRepository{Conn}}func (m *mysqlTodoListRepository) Create(ctx context.Context, t *models.Todolist) (err error) { // ... return}// Usecase 層type todoListUsecase struct { todoListRepo models.TodoListRepository}func NewTodoListUsecase(t models.TodoListRepository) models.TodoListRepository { return &todoListUsecase{  todoListRepo: t, }}func (tl *todoListUsecase) Create(ctx context.Context, t *models.Todolist) (err error) { if t.Title == "" {  return fmt.Errorf("illegal parameter") } return tl.todoListRepo.Create(ctx, t)}// Delivery 層type TodoListHandler struct { TodoListUsecase models.TodoListUsecase}func NewTodoListHandler(r *gin.Engine, todoListUsecase models.TodoListUsecase) { handler := &TodoListHandler{  TodoListUsecase: todoListUsecase, } r.POST("/create", handler.Create) r.Run()}// main 函數func main() { conn, err := sql.Open(`mysql`, "root:root@tcp(127.0.0.1:3306)/todolist") if err != nil {  log.Fatal(err) } r := gin.Default() todoListRepository := mysql.NewMysqlTodoListRepository(conn) todoListUsecase := usecase.NewTodoListUsecase(todoListRepository) http.NewTodoListHandler(r, todoListUsecase)}

閱讀上面這段代碼,我們可以發現 Repository 層依賴數據庫驅動 conn,Usecase 層依賴 Repository 層,Delivery 層依賴 Usecase 層。zQG28資訊網——每日最新資訊28at.com

以 Repository 層和 Usecase 層為例,我們可以發現 Usecase 層通過構造函數 func NewTodoListUsecase(t models.TodoListRepository) models.TodoListRepository 將其依賴項 models.TodoListRepository 以參數的形式傳遞過來,并將其放入 todoListUsecase 結構體中。zQG28資訊網——每日最新資訊28at.com

所以,我們使用 Usecase 層的構造函數 NewTodoListUsecase 創建 Usecase 對象時,需要先使用 Repository 層的構造函數 NewMysqlTodoListRepository 創建 Repository 對象,并將其以參數的形式傳遞給 Usecase 層的構造函數 NewTodoListUsecase。zQG28資訊網——每日最新資訊28at.com

通過依賴注入的方式,可以有效降低組件層級之間的耦合性,方便代碼的擴展。比如示例代碼中 Repository 層的方法修改代碼,不會影響 Usecase 層的代碼。zQG28資訊網——每日最新資訊28at.com

3 、依賴注入工具

除了手寫依賴注入代碼,我們也可以使用依賴注入工具,開源社區有很多依賴注入工具,其中比較流行的主要有以下 3 個。zQG28資訊網——每日最新資訊28at.com

Google 開源的依賴注入工具 Wire[1],它是一個代碼生成工具,也就是說它是在編譯時自動生成代碼。zQG28資訊網——每日最新資訊28at.com

另外 2 個依賴注入工具是在運行時基于 Go 反射實現,分別是 uber開源的依賴注入工具 Dig[2] 和 facebook 開源的依賴注入工具[3]。zQG28資訊網——每日最新資訊28at.com

讀者朋友們可以根據實際開發中的需求,選擇合適的工具。zQG28資訊網——每日最新資訊28at.com

4 、總結

讀者朋友們可能已經發現,依賴注入實際上就是面向對象五大原則之一,依賴倒置原則的實現方式。zQG28資訊網——每日最新資訊28at.com

我們可以在 Go 項目開發中,使用依賴注入的方式,降低組件層級之間的代碼耦合性,使代碼更方便擴展。zQG28資訊網——每日最新資訊28at.com

參考資料

[1]Google 開源的依賴注入工具 Wire: https://github.com/google/wirezQG28資訊網——每日最新資訊28at.com

[2]uber開源的依賴注入工具 Dig: https://github.com/uber-go/digzQG28資訊網——每日最新資訊28at.com

[3]facebook 開源的依賴注入工具: https://github.com/facebookarchive/injectzQG28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-80900-0.htmlGo 語言中怎么使用依賴注入?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 實戰三個有趣案例,十分鐘入門Canvas

下一篇: 無需花一分錢:輕松獲取SSL證書的三種方法

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元“人在職場,應該選擇什么樣的著裝?”近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網消息,據彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
  • 質感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
Top 主站蜘蛛池模板: 吴江市| 台州市| 宁津县| 壶关县| 兴国县| 泌阳县| 津市市| 波密县| 益阳市| 互助| 张家界市| 资中县| 塔河县| 沅江市| 富宁县| 姜堰市| 南召县| 西宁市| 栾城县| 黎川县| 潞西市| 皋兰县| 敦化市| 周宁县| 东平县| 云和县| 武邑县| 明水县| 宁晋县| 永和县| 渭南市| 长泰县| 盱眙县| 芦山县| 阿拉善右旗| 海伦市| 武汉市| 太白县| 泽州县| 和龙市| 利川市|