-
Notifications
You must be signed in to change notification settings - Fork 2
Home
cheivin edited this page Dec 29, 2021
·
6 revisions
DI
是一个简易版本的Go依赖注入实现。
- 支持手动注册bean实例
- 支持注册bean类型原型,由DI容器自动实例化并托管bean实例
- 支持根据名称、类型获取DI容器托管的bean实例
- 支持根据类型手动生成新的bean实例并返回
- 支持配置项注入并转换成对应的基本类型
- 支持匿名字段的bean注入
- Go 1.13及以上版本
- 下载并安装DI:
go get -u github.com/cheivin/di
- 将DI引入代码中
import "github.com/cheivin/di"
接下来,假设你有Service
、Dao
两个类,且Service
依赖Dao
// definition.go
package main
type (
Dao struct {
Prefix string `value:"db.prefix"`
}
Service struct {
Dao *Dao `aware:""`
}
)
func (s Service) GetPrefix() string {
return s.Dao.Prefix
}
在项目中配置并使用
// main.go
package main
import (
"fmt"
"github.com/cheivin/di"
)
func main() {
di.SetProperty("db.prefix", "demo").
Provide(Dao{}).
Provide(Service{}).
Load()
bean, ok := di.GetByType(Service{})
if !ok {
panic("service 不存在")
}
service := bean.(*Service)
fmt.Println("输出", service.GetPrefix())
}
然后运行代码,控制台会输出如下内容并退出:
[DI-INFO] : provide bean with name: dao
[DI-INFO] : provide bean with name: service
[DI-INFO] : wire value for bean dao(main.Dao)
[DI-INFO] : initialize bean dao(*main.Dao)
[DI-INFO] : initialize bean service(*main.Service)
[DI-INFO] : wire field for bean service(main.Service)
输出 demo
如需要使用context
控制容器退出,则请使用 Serve
。以监听终端信号为例,修改后如下:
// main.go
package main
import (
"context"
"fmt"
"github.com/cheivin/di"
"os/signal"
"syscall"
)
func main() {
di.SetProperty("db.prefix", "demo").
Provide(Dao{}).
Provide(Service{}).
Load()
bean, ok := di.GetByType(Service{})
if !ok {
panic("service 不存在")
}
service := bean.(*Service)
fmt.Println("输出", service.GetPrefix())
// 退出信号
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
di.Serve(ctx)
}