go 依赖注入,服务提供者,启动流程,退出流程……
先设计一个场景,我需要数据库连接
不少人使用Group.DB
方式保持连接。但是如果有多个数据库看起来就比较恶心了。可能有Group.DB1
、Group.DB2
注入方式, 定义
我这里是使用toolset ,其他开源的还有wire
、dig
(使用方式是不一样);这里的意思是logic需要一个连接,由mysql
提供者服务提供具体default
链接
// @Bean
type Logic struct {
Db *gorm.DB `inject:"mysql, default"`
}
我再声明一个mysql
提供者, 一个struc只要实现了GetBean函数那么他就可以在toolset 工具里作为服务提供者
// @Bean("mysql")
type MysqlProvider struct {
config *services.Config `inject:"config, database"`
}
func (c *MysqlProvider) GetBean(alias string) interface{} {/*忽略*/}
在上面代码目录分别执行toolset make:bean
, 工具会在源码目录生成注入代码,和统一的对外实例函数New{struct}()
。
func main() {
// 注册mysql
providers.NewMysqlProvider()
}
// 注册 mysql 后,任意地方都可以直接使用了
func TestLogic() {
fmt.Println(NewLogic().Db)
}
启动流程
所有拥有@Bean命令的都会检查是否实现了func (k *Struct) Init()
函数,用来替代全局init以实现初始化可控;
在所有的func (k *Struct) Init()
函数执行后,还会统一调用 func (k *Struct) Boot()
函数。用来执行循环依赖代码(需要用接口方式隔离)
使用依赖注入实现一个自定义框架
本作品采用《CC 协议》,转载必须注明作者和本文链接