Container:为Go语言而生的运行时依赖注入容器

Container是一款专为Go语言设计的运行时依赖注入库,利用反射机制提供类型安全的依赖管理。支持单例、原型对象和字符串值对象的绑定,提供Resolve、Call和Provider等方法实现依赖注入。此外,还支持对象的自动属性注入和容器继承。示例项目包括Glacier框架和Adanos-Alert报警系统。
摘要由CSDN通过智能技术生成

Container 是一款为 Go 语言开发的运行时依赖注入库。Go 语言的语言特性决定了实现一款类型安全的依赖注入容器并不太容易,因此 Container 大量使用了 Go 的反射机制。如果你的使用场景对性能要求并不是那个苛刻,那 Container 非常适合你。

并不是说对性能要求苛刻的环境中就不能使用了,你可以把 Container 作为一个对象依赖管理工具,在你的业务初始化时获取依赖的对象。

使用方式

 
go get github.com/mylxsw/container

要创建一个 Container 实例,使用 containier.New 方法

 
cc := container.New()

此时就创建了一个空的容器。

你也可以使用 container.NewWithContext(ctx) 来创建容器,创建之后,可以自动的把已经存在的 context.Context 对象添加到容器中,由容器托管。

对象绑定

在使用之前,我们需要先将我们要托管的对象告诉容器。Container 支持三种类型的对象管理

  • 单例对象 Singleton
  • 原型对象(多例对象) Prototype
  • 字符串值对象绑定 Value
所有的对象绑定方法都会返回一个 error 返回值来说明是否绑定成功,应用在使用时一定要主动去检查这个 error

确定对象一定会绑定成功(一般不违反文档中描述的参数签名方式,都是一定会成功的)或者要求对象必须要绑定成功(通常我们都要求这样,不然怎么进行依赖管理呢),则可以使用 Must 系列方法,比如 Singleton 方法对应的时 MustSingleton,当创建出错时,该方法会直接 panic

绑定对象时,SingletonPrototypeBindValue 方法对于同一类型,只能绑定一次,如果多次绑定同一类型对象的创建函数,会返回 ErrRepeatedBind 错误。

有时候,希望对象创建函数可以多次重新绑定,这样就可以个应用更多的扩展性,可以随时替换掉对象的创建方法,比如测试时 Mock 对象的注入。这时候我们可以使用 Override 系列方法:

  • SingletonOverride
  • PrototypeOverride
  • BindValueOverride

使用 Override 系列方法时,必须保证第一次绑定时使用的是 Override 系列方法,否则无法重新绑定。

也就是说,可以这样绑定 SingletonOverride -> SingletonOverrideSingletonOverride -> Singleton,但是一旦出现 Singleton,后续就无法对该对象重新绑定了。

单例对象

使用 Singleton 系列的方法来将单例对象托管给容器,单例对象只会在第一次使用时自动完成创建,之后所有对该对象的访问都会自动将已经创建好的对象注入进来。

常用的方法是 Singleton(initialize interface{}) error 方法,该方法会按照你提供的 initialize 函数或者对象来完成单例对象的注册。

参数 initialize 支持以下几种形式:

  • 对象创建函数 func(deps...) 对象返回值

    比如

     
    cc.Singleton(func() UserRepo { 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值