围绕 go.uber.org/dig 的轻量级启动器,集成了多命名空间容器管理(依赖 github.com/kordar/goframework-dig),并提供:
- 多容器(命名空间)管理:按 namespace 获取容器,Provide/Invoke/Decorate/Scope 封装
- 模块化加载:以配置驱动方式创建容器,并在加载时回调,便于在自定义逻辑中注册依赖
go get github.com/kordar/dig-starter- 多命名空间容器
- AddDigInstance/HasDigInstance/GetDigInstance 由 goframework-dig 管理
- 本库提供按 namespace 的 Provide/Invoke/Decorate/Scope 快捷封装
- 模块化加载
- NewDigModule(name, load) 创建模块
- Load(value) 接收 map 配置,并在每个实例创建后回调
load(moduleName, itemId, item) - 支持
id_default: true将该实例标记为默认命名空间
package main
import (
digstarter "github.com/kordar/dig-starter"
"go.uber.org/dig"
)
type Config struct {
DSN string
}
func main() {
// 定义模块与回调:在实例创建后,把需要的构造函数注册到对应 namespace 容器
m := digstarter.NewDigModule("app", func(moduleName, itemId string, item map[string]interface{}) {
// 示例:为该 namespace 注册 Config 与 Service
digstarter.ProvideEByNamespace(itemId, func() *Config {
return &Config{DSN: "memory"}
})
digstarter.ProvideEByNamespace(itemId, func(cfg *Config) *dig.Scope {
// 也可以返回 Scope 或其他对象,这里仅演示
return digstarter.ScopeByNamespace(itemId, "svc")
})
})
// 支持单实例(顶层包含 id):
m.Load(map[string]interface{}{
"id": "app-main",
"id_default": true, // 可选:标记默认 namespace
// 其他业务自定义字段……(在回调的 item 中可以读取)
})
// 或者多实例:
// m.Load(map[string]interface{}{
// "app-main": map[string]interface{}{"id_default": true},
// "app-admin": map[string]interface{}{},
// })
}// 在默认 namespace(由 id_default 指定)注册
digstarter.ProvideE(func() string { return "hello" })
// 在默认 namespace 调用
_ = digstarter.Invoke(func(msg string) {
// 使用 msg
})
// 在指定 namespace 注册/调用
_ = digstarter.ProvideByNamespace("app-main", func() int { return 42 })
_ = digstarter.InvokeByNamespace("app-main", func(n int) {
// 使用 n
})- 容器与命名空间
GetDig(namespace string) *dig.Container:获取指定 namespace 的容器(不存在将 Fatal)
- Provide/Invoke/Decorate/Scope
Provide(constructor, ...opts)/ProvideE(...)ProvideByNamespace(namespace, constructor, ...opts)/ProvideEByNamespace(...)Invoke(function, ...opts)/InvokeE(...)InvokeByNamespace(namespace, function, ...opts)/InvokeEByNamespace(...)DecorateByNamespace(namespace, decorator, ...opts)/DecorateEByNamespace(...)ScopeByNamespace(namespace, name, ...opts)、Scope(name, ...opts)
- 模块化加载
type DigModule struct { name string; load func(moduleName, itemId string, item map[string]interface{}) }NewDigModule(name string, load func(moduleName, itemId string, item map[string]interface{})) *DigModuleLoad(value interface{}):支持- 单实例:
map[string]interface{}{ "id": "xxx", "id_default": true, ... } - 多实例:
map[string]interface{}{ "ns1": {...}, "ns2": {...} }
- 单实例:
id:实例命名空间(单实例时置于顶层;多实例时为 map key)id_default:bool,是否将该实例设为默认命名空间- 其他字段:完全由业务自定义,原样透传到回调的
item中
- 多容器由
github.com/kordar/goframework-dig统一管理;本库只做简化封装 - 所有 E 结尾方法在出错时以 Fatal 形式终止,适用于启动期
MIT