经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
golang依赖注入工具digo
来源:cnblogs  作者:werben  时间:2023/6/2 10:51:21  对本文有异议

golang依赖注入工具

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

特性

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

快速开始

更多示例请参考:examples

编写代码和注解

  1. package main
  2. import (
  3. "log"
  4. "github.com/werbenhu/digo"
  5. )
  6. // @provider({"id":"main.db.url"})
  7. func NewDbUrl() string {
  8. return "localhost:3306"
  9. }
  10. type Db struct {
  11. url string
  12. }
  13. // @provider({"id":"main.db"})
  14. // @inject({"param":"url", "id":"main.db.url"})
  15. func NewDb(url string) *Db {
  16. return &Db{
  17. url: url,
  18. }
  19. }
  20. type App struct {
  21. Db *Db
  22. }
  23. // @provider({"id":"main.app"})
  24. // @inject({"param":"db", "id":"main.db"})
  25. func NewApp(db *Db) *App {
  26. return &App{
  27. Db: db,
  28. }
  29. }
  30. func (a *App) Start() {
  31. log.Printf("app strat, db:%s\n", a.Db.url)
  32. }
  33. func main() {
  34. app, err := digo.Provide("main.app")
  35. if err == nil {
  36. app.(*App).Start()
  37. }
  38. }

安装digogen工具

  1. go install github.com/werbenhu/digo/digogen@v1.0.0

生成依赖注入代码

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

  1. digogen

运行代码

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

注解详情

@provider

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

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

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

  1. app, err := digo.Provide("main.app")
  2. if err == nil {
  3. app.(*App).Start()
  4. }

@inject

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

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

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

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

@group

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

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

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

  1. ctrls, err := digo.Members("main.controllers")
  2. if err == nil {
  3. for _, controller := range ctrls {
  4. // TODO:
  5. }
  6. }

原文链接:https://www.cnblogs.com/werben/p/17451017.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号