go 依赖注入,服务提供者,启动流程,退出流程……

先设计一个场景,我需要数据库连接

不少人使用Group.DB方式保持连接。但是如果有多个数据库看起来就比较恶心了。可能有Group.DB1Group.DB2

注入方式, 定义

我这里是使用toolset ,其他开源的还有wiredig(使用方式是不一样);这里的意思是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()函数。用来执行循环依赖代码(需要用接口方式隔离)

使用依赖注入实现一个自定义框架

gitee.com/ctfang/go-admin

go 依赖注入,服务提供者,启动流程,退出流程……

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!