这是一个非常简易的容器实现,主要方便嵌入到项目中,方便初始化一些服务,如:数据库、redis、缓存等。
A simple container class implemented by go to facilitate the management of service objects.
- 支持共享/非共享服务类型
- Support shared / non shared service type
- 注册服务支持工厂函数、实例对象
- You can register factory function or an instance to container
- 支持刷新容器,清空实例缓存,下次获取服务重新调用工厂函数生成
- Support refresh instance cache, so that you resolve service again
- 支持添加释放回调函数,当释放容器的时候触发,用于释放数据库等连接
- Support register release function so when your program end, you can release some resource such as database connection.
Require Go 1.9+
go get github.com/keepeye/go-container
import (
"github.com/keepeye/go-container/container"
"time"
)
func main() {
// 我们有一个默认的容器实例,直接通过 container调用所有方法
// We have a default container instance, call all methods through container.XXX
// 或者你可以创建一个新的container对象 通过container.NewContainer()
// or you can make a new container, through container.NewContainer()
container.Bind("foo", func(c *Container) interface{}{
return time.Now().UnixNano()
}, true)
v1 := container.Get("foo")
v2 := container.Get("foo")
fmt.Println(v1,v2) // v1 == v2
container.Instance("bar", "12345")
fmt.Println(container.Get("bar").(string)) // output:12345
// 注册一个数据库服务
// let's register a db service
container.Bind("db", func(c *Container) interface{} {
db, err := gorm.Open("mysql", "YOUR DATABASE CONNECTION DSN")
if err != nil {
panic(err)
}
// 注册释放函数
// add release function
c.BeforeRelease(func() {
db.Close()
})
return db
}, true)
// 别忘了程序结束的时候调用'Release()'方法
// Don't forget to call the'Release () method at the end of the program.
defer container.Release()
}
获取一个服务
Get Resolve a service
注册一个服务,如果share=true,那么这个服务是单例的,工厂函数只会执行一次
Bind Bind a service, if shared is true, the service will resolve only once
注册一个共享单例服务
Register a shared service
注册一个实例对象,实际上会被封装成一个工厂方法,注册成为一个共享服务
Instance Register a resolved instance, it's actually going to be converted to a shared service
判断容器中是否含有某个服务
Has Detect if has a service
移除某个服务
Remove Remove a service from container
添加一个释放时回调函数
BeforeRelease Add a function which will be called at releasing
释放资源,触发所有释放回调函数
Release Call all release functions
刷新容器实例缓存和释放函数
Refresh Clear resolved service and release functions
你有任何好的想法,都可以创建 issue ,或者通过 pull-request 帮我完善这个项目 If you have any good ideas, you can create issue, or help me improve this project through pull-request.