golang 每日一庫之依賴注入庫 samber-do

do 是 Go 語言中一個輕量級的依賴注入(Dependency Injection, DI)容器,由 samber 開發。它基於 Go 1.18+ 泛型實現,爲 Go 提供了一個類型安全的 DI 方案。

do 庫的設計理念是簡化服務組件之間的依賴管理,取代手工創建依賴關係的繁瑣工作,使不同組件之間鬆散耦合、更易測試與維護。

與反射型 DI 框架不同,do 在註冊和解析依賴時不使用反射,因此性能開銷很小。

功能簡介

參考示例

下面給出一個簡單示例,演示如何使用 do 完成依賴注入。假設有兩個服務 Engine 和 Car,其中 Car 依賴於 Engine

type Engine struct {
    Started bool
}
// 構造函數:創建 Engine 實例
func NewEngine(i do.Injector) (*Engine, error) {
    return &Engine{Started: false}, nil
}
type Car struct {
    Engine *Engine
}
// 構造函數:創建 Car 實例時自動注入 Engine
func NewCar(i do.Injector) (*Car, error) {
    engine := do.MustInvoke[*Engine](i) // 從容器中獲取 Engine
    return &Car{Engine: engine}, nil
}
func (c *Car) Start() {
    c.Engine.Started = true
    println("Car is running")
}

在 main 函數中創建容器、註冊服務並調用:

func main() {
    injector := do.New()                // 創建依賴注入容器
    do.Provide(injector, NewEngine)    // 註冊 Engine 服務(懶加載單例)
    do.Provide(injector, NewCar)       // 註冊 Car 服務,依賴 Engine
    // 獲取 Car 實例(會自動創建 Car 及其依賴 Engine)
    car := do.MustInvoke[*Car](injector)
    car.Start()                         // 使用服務
    injector.Shutdown()                // 關閉容器,按註冊順序倒序調用可選的 Shutdown 鉤子
}

以上代碼中,調用 do.Provide 將構造函數註冊到容器,do.MustInvoke[*Car] 會觸發容器根據依賴關係創建對象並返回。運行後會輸出 "Car is running"。如果服務實現了 Shutdown() 方法(實現 do.Shutdownable),容器在調用 injector.Shutdown() 時也會自動調用它完成清理。

優勢有哪些

使用 do 庫相比手動通過 new 或自己維護全局變量的方式,有以下優勢:

對於有多個互相依賴組件、希望簡化啓動與測試流程的項目,do 是一個友好的選擇。

標題:golang 每日一庫之依賴注入庫 samber/do
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/05/09/1746754797718.html
聯繫:scotttu@163.com

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/H2uic0Ws9bgztXzSslAYcA