每天忙碌的日子,也不要忘记了好好生活 🏠

vuePress-theme-reco happylay 🐑    2020 - 2021
每天忙碌的日子,也不要忘记了好好生活 🏠 每天忙碌的日子,也不要忘记了好好生活 🏠

Choose mode

  • dark
  • auto
  • light
主页
分类
  • 手册
  • 前端
  • 后端
  • 工作
  • 相册
  • 文档
标签
时间轴
文档
  • 轨迹
个人空间
  • 哔哩哔哩
  • 编辑博客
工具集
  • 后端工具

    • 在线json解析
    • yml格式转换
    • websocket测试
    • 时间戳转换
    • cron表达式
    • linux程序包
    • 大小写转换
    • toml格式转换
  • 后端框架

    • Spring
    • GoFrame
  • 前端工具

    • Vant移动端组件库
    • Element桌面端组件库
    • uni-app移动端框架
    • uview移动端框架
    • colorui2.0文档
    • Figma
    • Codepen
    • Dribbble
    • Iconfont阿里矢量图库
    • IconPark图标库
    • Icomoon
    • Remixicon
    • favicon图标制作
  • 开发环境

    • windows包管理器-baulk
    • windows包管理器-scoop
    • windows原版镜像
    • nexus3仓库
  • 微服务

    • 版本兼容关系
    • k8s在线配置
    • k8s接口文档
GitHub
author-avatar

happylay 🐑

34

文章

24

标签

主页
分类
  • 手册
  • 前端
  • 后端
  • 工作
  • 相册
  • 文档
标签
时间轴
文档
  • 轨迹
个人空间
  • 哔哩哔哩
  • 编辑博客
工具集
  • 后端工具

    • 在线json解析
    • yml格式转换
    • websocket测试
    • 时间戳转换
    • cron表达式
    • linux程序包
    • 大小写转换
    • toml格式转换
  • 后端框架

    • Spring
    • GoFrame
  • 前端工具

    • Vant移动端组件库
    • Element桌面端组件库
    • uni-app移动端框架
    • uview移动端框架
    • colorui2.0文档
    • Figma
    • Codepen
    • Dribbble
    • Iconfont阿里矢量图库
    • IconPark图标库
    • Icomoon
    • Remixicon
    • favicon图标制作
  • 开发环境

    • windows包管理器-baulk
    • windows包管理器-scoop
    • windows原版镜像
    • nexus3仓库
  • 微服务

    • 版本兼容关系
    • k8s在线配置
    • k8s接口文档
GitHub
  • 2021

    • casbin实现权限控制
    • dig实现依赖注入
    • ffmpeg视频推流总结
    • gcc编译环境配置
    • goframe常见问题总结
    • goframe框架总结
    • golang工具总结
    • golang语法总结
    • protobuf安装与使用
    • redis实现分布式锁
    • 常用golang库总结

dig实现依赖注入

vuePress-theme-reco happylay 🐑    2020 - 2021

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

# 使用

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
编辑文档
最后一次更新: 2021/2/2 下午12:34:17
欢迎来到小屋。
看板娘