Golang实现依赖注入容器,提供内部服务实例管理。
go get github.com/gookit/di
package main
import (
"github.com/gookit/di"
)
func main() {
box := di.New("my-services")
// 添加简单的值
box.Set("service0", "val1")
box.Set("service1", &MyService1{})
// 注册一个回调函数。
// - 它会在第一次获取时执行。
// - 执行返回的结果,会被保存起来
// - 后续获取时都是拿到的第一次的结果,不会再次执行这个函数
box.Set("service2", func() (interface, error) {
return &MyApp{}, nil
})
// 注册一个工厂函数
// - 每次获取时,都会执行这个函数。不会保存结果,每次都返回新的。
box.Set("service3", func() (interface, error) {
return &MyObject{}, nil
}, true)
// 获取
v1 := box.Get("service1") // "val1"
// 是一个闭包,会自动执行它. 注意: v2 == v3
v2 := box.Get("service2").(*MyApp)
v3 := box.Get("service2").(*MyApp)
// 是一个工厂方法. 注意: v4 != v5
v4 := box.Get("service3").(*MyObject)
v5 := box.Get("service3").(*MyObject)
}
func (c *Container) Set(name string, val interface{}, isFactory ...bool) *Container
func (c *Container) Get(name string) interface{}
func (c *Container) SafeGet(name string) (val interface{}, err error)
func (c *Container) Inject(ptr interface{}) (err error)