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

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

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

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

1 、介紹

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

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

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

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

2 、Go 語言使用依賴注入

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

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

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

  • Models
  • Repository
  • Usecase
  • Delivery

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

示例代碼:I2L28資訊網——每日最新資訊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 層。I2L28資訊網——每日最新資訊28at.com

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

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

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

3 、依賴注入工具

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

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

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

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

4 、總結

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

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

參考資料

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 楚雄市| 铁岭县| 明光市| 武安市| 梧州市| 公安县| 广德县| 夏河县| 临沭县| 临洮县| 惠州市| 紫云| 怀安县| 兰考县| 霍城县| 平罗县| 石阡县| 镇雄县| 肥乡县| 惠来县| 景德镇市| 永春县| 临夏市| 喀什市| 平原县| 彭泽县| 凯里市| 交城县| 利津县| 新安县| 高安市| 武山县| 崇州市| 通山县| 汽车| 株洲县| 泗洪县| 抚宁县| 江永县| 子长县| 托克托县|