您当前的位置:首页滚动 >  >> 
golang依赖注入工具digo 焦点速读
来源:博客园      时间:2023-06-02 11:17:34


【资料图】

golang依赖注入工具

digo工具地址:https://github.com/werbenhu/digo

特性使用注释中的注解自动代码生成自动检测循环依赖编译时期依赖注入自动初始化支持实例组的管理快速开始

更多示例请参考:examples

编写代码和注解
package mainimport ("log""github.com/werbenhu/digo")// @provider({"id":"main.db.url"})func NewDbUrl() string {return "localhost:3306"}type Db struct {url string}// @provider({"id":"main.db"})// @inject({"param":"url", "id":"main.db.url"})func NewDb(url string) *Db {return &Db{url: url,}}type App struct {Db *Db}// @provider({"id":"main.app"})// @inject({"param":"db", "id":"main.db"})func NewApp(db *Db) *App {return &App{Db: db,}}func (a *App) Start() {log.Printf("app strat, db:%s\n", a.Db.url)}func main() {app, err := digo.Provide("main.app")if err == nil {app.(*App).Start()}}
安装digogen工具
go install github.com/werbenhu/digo/digogen@v1.0.0
生成依赖注入代码

打开命令行执行下面命令,digogen将会根据注解自动生成digo.generated.go源码文件.

digogen
运行代码

go run .\digo.generated.go .\main.go

注解详情@provider

@provider注解表示是一个实例提供者,该实例是一个单例

示例
// @provider({"id":"main.db"})
支持的参数:
参数类型是否必需说明
idstring实例的id

如果获取实例,通过digo.Provide(providerId)可以获取到某一个provider的实例

app, err := digo.Provide("main.app")if err == nil {app.(*App).Start()}
@inject

@inject注解表示注入一个实例到某个参数, @inject注解必须和@provider或者@group二者中的一个同时存在.

示例
// @inject({"param":"db", "id":"main.db"})
支持的参数:
参数类型是否必需说明
paramstring指明哪个参数需要注入实例
idstring指明需要注入的实例id
pkgstring该参数需要引入特定的包

pkg在什么时候需要使用,比如我们需要引入一个包 github.com/xxx/tool/v1, 我们使用包名的时候是这样使用的 *tool.Struct, 而不是 *v1.Struct,那我们需要显示指明需要导入github.com/xxx/tool/v1

// @inject({"param":"tool", "id":"main.tool", "pkg":"github.com/xxx/tool/v1"})
@group

@group注解表示将实例注册到一个组

示例
// @group({"id":"main.controllers"})
支持的参数:
参数类型是否必需说明
idstring组的id

如果获取组的所有实例,通过digo.Members(groupId)可以获取到组的所有实例

ctrls, err := digo.Members("main.controllers")if err == nil {    for _, controller := range ctrls {        // TODO:    }}
标签:

X 关闭

X 关闭