Golang依赖注入工具"do" - v2版本发布

Golang依赖注入工具"do" - v2版本发布 samber/do 是一个轻量级的 Go 依赖注入库,可帮助您以清晰且类型安全的方式管理服务生命周期、依赖项和作用域。

v2 版本引入了全新的基于作用域的架构,支持瞬时服务、改进了依赖项跟踪并增加了循环依赖检测。错误处理和服务命名更加一致,并且现在支持健康检查/关闭接口。

变更日志 👇

Release v2.0.0 · samber/do

Release v2.0.0 · samber/do

🧭 迁移说明 迁移指南请参阅:https://do.samber.dev/docs/upgrading/from-v1-x-to-v2 ⚠️ 破坏性变更

  • do.Injector 结构体变为接口
  • injector.ListProvidedServices 现在 …

更多关于Golang依赖注入工具"do" - v2版本发布的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang依赖注入工具"do" - v2版本发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


samber/do v2 版本的发布是一个重要的升级,其基于作用域的架构使得依赖管理更加清晰和强大。以下是一个简单的示例,展示如何使用 v2 的新特性来管理具有作用域的服务生命周期和依赖注入:

package main

import (
    "context"
    "fmt"
    "github.com/samber/do/v2"
)

// 定义一些服务
type DatabaseService struct{}
func (d *DatabaseService) Shutdown() error {
    fmt.Println("Database shutdown")
    return nil
}

type UserService struct {
    db *DatabaseService
}
func NewUserService(i do.Injector) (*UserService, error) {
    db := do.MustInvoke[*DatabaseService](i)
    return &UserService{db: db}, nil
}
func (u *UserService) HealthCheck() error {
    fmt.Println("UserService health check OK")
    return nil
}

func main() {
    // 创建根注入器
    injector := do.New()
    
    // 注册瞬时服务
    do.ProvideNamedValue(injector, "db", &DatabaseService{})
    
    // 注册单例服务(支持构造函数)
    do.Provide(injector, NewUserService)
    
    // 使用作用域
    scope := injector.Scope("request")
    
    // 从作用域中获取服务
    userService := do.MustInvoke[*UserService](scope)
    
    // 执行健康检查
    _ = do.HealthCheck(scope)
    
    // 优雅关闭
    _ = do.Shutdown(scope)
    
    // 循环依赖检测(v2 新增)
    // 如果存在循环依赖,do 会在 Provide 时检测并报错
}

v2 将 Injector 改为接口,这提高了测试的灵活性和可扩展性。新的作用域系统允许更精细地控制服务生命周期,瞬时服务现在可以正确地在每次请求时创建新实例。错误处理也更加一致,所有方法都返回 error 而不是混合使用 panic。

健康检查接口的集成让服务状态管理更加标准化,而改进的依赖项跟踪使得调试复杂依赖关系变得更加容易。迁移时需要注意 API 的变化,特别是 Injector 接口化和服务注册/获取方法的更新。

回到顶部