Skip to content

kordar/dig-starter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dig-starter

围绕 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 将该实例标记为默认命名空间

快速开始

1. 模块化加载并注册依赖

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{}{},
    // })
}

2. 使用封装的 Provide/Invoke

// 在默认 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
})

API 一览

  • 容器与命名空间
    • 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{})) *DigModule
    • Load(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 形式终止,适用于启动期

License

MIT

About

dig starter

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages