Golang依赖注入工具"do" - v2版本发布
Golang依赖注入工具"do" - v2版本发布 samber/do 是一个轻量级的 Go 依赖注入库,可帮助您以清晰且类型安全的方式管理服务生命周期、依赖项和作用域。
v2 版本引入了全新的基于作用域的架构,支持瞬时服务、改进了依赖项跟踪并增加了循环依赖检测。错误处理和服务命名更加一致,并且现在支持健康检查/关闭接口。
变更日志 👇
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
更多关于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 接口化和服务注册/获取方法的更新。

