golang依赖注入工具digo
golang依赖注入工具
digo工具地址:https://github.com/werbenhu/digo
特性
- 使用注释中的注解
- 自动代码生成
- 自动检测循环依赖
- 编译时期依赖注入
- 自动初始化
- 支持实例组的管理
快速开始
更多示例请参考:examples
编写代码和注解
package main
import (
"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"})
- 支持的参数:
| 参数 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
| id | string | 是 | 实例的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"})
- 支持的参数:
| 参数 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
| param | string | 是 | 指明哪个参数需要注入实例 |
| id | string | 是 | 指明需要注入的实例id |
| pkg | string | 否 | 该参数需要引入特定的包 |
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"})
- 支持的参数:
| 参数 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
| id | string | 是 | 组的id |
如果获取组的所有实例,通过digo.Members(groupId)可以获取到组的所有实例
ctrls, err := digo.Members("main.controllers")
if err == nil {
for _, controller := range ctrls {
// TODO:
}
}
golang依赖注入工具digo的更多相关文章
- Golang依赖管理工具: go module 详解
Golang依赖管理工具: go module (go1.11+) 大多数语言都会有包管理工具,像Node有npm,PHP有composer,Java有Maven和Gradle. 可是,Go语言一直缺 ...
- Golang依赖管理工具:glide从入门到精通使用
这是一个创建于 2017-07-22 05:33:09 的文章,其中的信息可能已经有所发展或是发生改变. 介绍 不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题.Java有牛逼轰轰 ...
- 【ASP.NET MVC 学习笔记】- 05 依赖注入工具Ninject
本文参考:http://www.cnblogs.com/willick/p/3223042.html 1.Ninject是一款轻量级的DI工具,可通过VS的插件NuGet将其引用到项目中. 2.使用N ...
- Compile-time Dependency Injection With Go Cloud's Wire 编译时依赖注入 运行时依赖注入
Compile-time Dependency Injection With Go Cloud's Wire - The Go Blog https://blog.golang.org/wire Co ...
- golang常用库包:Go依赖注入(DI)工具-wire使用
google 出品的依赖注入库 wire:https://github.com/google/wire 什么是依赖注入 依赖注入 ,英文全名是 dependency injection,简写为 DI. ...
- <Pro .NET MVC4> 三大工具之依赖注入神器——Ninject
这篇内容是对<Pro .NET MVC4>一书中关于Ninject介绍的总结. Ninject是.NET MVC的一款开源的依赖注入工具. 使用场景:当MVC项目中使用了依赖注入技术来给程 ...
- Java Web系列:Spring依赖注入基础
一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...
- .Net Core中依赖注入服务使用总结
一.依赖注入 引入依赖注入的目的是为了解耦和.说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用.这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将 ...
- 谈谈 Act 的依赖注入 和 模板输出 - 回答 drinkjava 同学提问
1. 背景 依赖注入工具 jBeanBox 的作者 drinkjava 同学最近在 Actframework gitee 项目 的提出了如下评论: 你这个DI工具的出发点可能有问题,一个MVC工具为什 ...
- Go工程化 - 依赖注入
我们在微服务框架kratos v2的默认项目模板中kratos-layout使用了google/wire进行依赖注入,也建议开发者在维护项目时使用该工具. wire 乍看起来比较违反直觉,导致很多同学 ...
随机推荐
- 机器学习基础05DAY
分类算法之k-近邻 k-近邻算法采用测量不同特征值之间的距离来进行分类 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 一个例子弄懂k-近 ...
- 第四部分:Spdlog日志库的核心组件分析-logger
Spdlog是一个快速且可扩展的C++日志库,它支持多线程和异步日志记录.在本文中,我们将分析Spdlog日志库的核心代码,探究其实现原理和代码结构. Spdlog的基本架构 上一篇文章介绍了spdl ...
- 一次因生产事故与chatGpt的对话
一次因生产事故与chatGpt的对话 前言:生产出现了一个内存溢出的事故,记录错误信息.错误日志如下 org.springframework.web.util.NestedServletExcepti ...
- STM32F407 学习 (0) 各种外设功能 (中)
十.高级定时器 1.重复计数器 如果我们设置重复计数器寄存器 RCR 的值为 N,那么更新事件将在定时器发生 N+1 次上溢或下溢时发生.重复计数器的特性,在控制生成 PWM 信号时很有用. 2. ...
- 垃圾回收之三色标记法(Tri-color Marking)
关于垃圾回收算法,基本就是那么几种:标记-清除.标记-复制.标记-整理.在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率. 无论使用哪种算法,标记总是必要的 ...
- [Java SE]Java方法的参数传递机制:值传递
1 案例引入:实验源码 [案例结论] 若调用方client想通过修改方法updateMethod(oldObject)对调用方所在的引用对象(非基本数据类型)oldObject的属性值进行修改,则: ...
- 《花雕学AI》13:早出对策,积极应对ChatGPT带来的一系列风险和挑战
ChatGPT是一款能和人类聊天的机器人,它可以学习和理解人类语言,也可以帮人们做一些工作,比如翻译.写文章.写代码等.ChatGPT很强大,让很多人感兴趣,也让很多人担心. 使用ChatGPT有一些 ...
- systemctl 命令设置开机自启动失败
哈喽大家好,我是咸鱼.今天跟大家分享一个关于 Linux 服务(service)相关的案例 案例现象 我在 3 月 31日的时候发表了一篇<shell 脚本之一键部署安装 Nginx> ...
- 人群定向SQL表
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for rc_throng -- ------ ...
- Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?
系列文章 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用 ...