go.uber.org/dig
依赖注入,抽象接口,依赖于抽象接口,而不依赖于具体的对象,实现接口的相互依赖。(可解决同级包的循环引用问题)
引用包:go.uber.org/dig
- 创建全局容器:Container := dig.New()
- 每个抽象往容器中注入依赖:err := Container.Provide()
- 每个实现类从容器中检索调用抽象:err := Container.Invoke()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// repository/dependency/dependency.go 容器注入,使用单独一个包存注入代码,方便其他同级的包互相引用
var ContainerDI = dig.New()
func init() {
_ = ContainerDI.Provide(NewStaffTaskRepo) // 注入依赖
}
type IStaffTask interface {
GetData(ctx echo.Context)
}
// repository/logic/logic.go 实现接口
type staffTaskRepo struct {}
func NewStaffTaskRepo() IStaffTask {
return StaffTaskRepo
}
func (staffTaskRepo) GetData(ctx echo.Context) {
// todo
}
// repository/logic2/quote.go 调用依赖
type staffRepo struct {
staffTaskRepo IStaffTask
}
func (r * staffRepo) Login() {
var o sync.Once
o.Do(func() {
_ = ContainerDI.Invoke(func(staffTask IStaffTask) {
r.staffTaskRepo = staffTask
})
})
r.staffTaskRepo.GetData()
}
|