go.uber.org/dig

依赖注入,抽象接口,依赖于抽象接口,而不依赖于具体的对象,实现接口的相互依赖。(可解决同级包的循环引用问题)

引用包:go.uber.org/dig

  1. 创建全局容器:Container := dig.New()
  2. 每个抽象往容器中注入依赖:err := Container.Provide()
  3. 每个实现类从容器中检索调用抽象: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()
}