dig实现依赖注入
happylay 🐑 2021-01-18 21:12:53 golang
摘要: dig实现依赖注入 时间: 2021-01-18
# 安装
go get -v go.uber.org/dig
或
require go.uber.org/dig v1.10.0
1
2
3
2
3
# 使用
package gfbean
import (
"fmt"
"testing"
"github.com/gogf/gf/frame/g"
"go.uber.org/dig"
)
// --------------------------------测试1--------------------------------
type Version struct {
Id string
Name string
}
func (p *Version) getId() string {
return p.Id
}
func newPerson() Version {
return Version{
Id: "1.0.6",
Name: "gf-extend",
}
}
// 测试注入依赖
func TestDig(t *testing.T) {
// 创建容器
container := dig.New()
// 注入依赖
err := container.Provide(newPerson)
if err != nil {
fmt.Println(err)
}
// 使用依赖
err = container.Invoke(func(p Version) {
// 业务逻辑
fmt.Println(p.getId())
})
if err != nil {
fmt.Println(err)
}
}
// --------------------------------测试2--------------------------------
// 参数对象
type needPerson1 struct {
dig.In // 打包依赖
P Version `name:"v"` // 命名依赖
}
// 注入命名依赖
func TestDigName(t *testing.T) {
// 创建容器
container := dig.New()
// 注入命名依赖
err := container.Provide(newPerson, dig.Name("v"))
if err != nil {
fmt.Println(err)
}
// 使用依赖
err = container.Invoke(func(n needPerson1) {
// 业务逻辑
g.Dump(n)
})
if err != nil {
fmt.Println(err)
}
}
// --------------------------------测试4--------------------------------
// 参数对象
type needPerson2 struct {
dig.In // 打包依赖
P []Version `group:"v"` // 组依赖,必须是个切片
}
// 注入组依赖
func TestDigGroup(t *testing.T) {
// 创建容器
container := dig.New()
// 注入命名依赖
err := container.Provide(newPerson, dig.Group("v"))
if err != nil {
fmt.Println(err)
}
// 使用依赖
err = container.Invoke(func(n needPerson2) {
// 业务逻辑
g.Dump(n)
})
if err != nil {
fmt.Println(err)
}
}
// --------------------------------测试5--------------------------------
// 结果对象
type outVersion struct {
dig.Out
Version Version `group:"version"`
}
// 参数对象
type inVersion struct {
dig.In
Versions []Version `group:"version"`
}
func newOut() outVersion {
return outVersion{
Version: Version{
Id: "2021",
Name: "1.0.7",
},
}
}
// 构造容器Bean
func buildBeanContainer() *dig.Container {
container := dig.New()
err := container.Provide(newOut)
if err != nil {
fmt.Println(err)
}
return container
}
// 测试结果对象注入
func TestDigOut(t *testing.T) {
container := buildBeanContainer()
err := container.Invoke(func(in inVersion) {
g.Dump(in)
})
if err != nil {
fmt.Println(err)
}
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158