文章图片
文章图片
文章图片
文章图片
需要依赖注入时 , Go有什么实现方案?本文详细介绍了使用google/wire库实现依赖注入的方法 。
google/wire 是 Go 语言的编译时依赖注入框架 , 与 Spring IoC 一样 , wire 的目的也是让开发者从对项目中大量依赖的创建和管理中解脱出来 , 但两者在实现方式上有着很大的不同 。
Go 中的依赖注入
在 Go 中 , 我们通常采取在构造函数中传入依赖的方式创建对象:
这在小规模项目中效果很好 , 但当项目规模变大时 , 单个对象的创建往往需要多个依赖 , 而这些依赖通常还有它自己的依赖 , 这就导致对象的创建变得繁琐 , 容易出错 。
wire 如何完成依赖注入
在开发中 , 我们创建对象的过程可以分为两步:
1.定义结构体的构造函数
2.调用结构体的构造函数进行实例化
第一步我们声明了构造结构体需要的依赖 , 而 wire 做的 , 就是 帮我们“写”好第二步的代码 。
依赖声明
为了生成第二步中的代码 , 我们首先需要将所有的构造函数(准确的说是所有需要注入的依赖)进行声明并传递给 wire.Build 方法:
setup 函数的内容最终会被 wire 用下面的实现替换(接下来会进行说明):
可以看到上面 wire 为我们“写”好的代码其实跟我们自己将会写的代码是一样的 , 可以很容易的读懂 。 但随着依赖增多 , 这样的代码就会增加 , 想象一下 , 如果项目中有上百个依赖 , 那么就会有上百行的 New...(...) if err != nil {... 代码 。
使用 go generate 生成依赖注入代码
wire 就是做了这样一件事:帮我们生成所有需要的对象创建代码 , 开发时我们只需要在结构体的构造函数中声明自己需要什么 。
wire 在实际项目中的使用步骤:
- 通过 wire.Bind 方法进行依赖声明 , 假设这部分代码放在 inject.go 文件中
- 使用 go generate http://c.biancheng.net/view/4442.html 命令生成代码
【薇娅|go也能依赖注入?进来细说】
1.在项目目录下执行 go generate 命令 。
运行该命令时 , 它将扫描与当前包相关的源代码文件 , 找出所有包含 //go:generate 的特殊注释 , 提取并执行该特殊注释后面的命令 。
至此 , 你就可以看到 wire_gen.go 里已经生成好 func setup(ctx context.Context) (sv *server.Server clean func() err error) 方法 , 方法体为依赖注入(对象创建)代码 。
2.最后一步 , 在 main 方法中调用 setup 方法(这里假设我们的项目是一个提供 RESTful 接口的 HTTP 服务)
需要注意的是 , 如果 inject.go 和 wire_gen.go 在同一个 package 下 , 那此时 IDE 会提示语法错误 , 因为两个文件下存在方法签名一样的两个方法 。 此时可以使用 //+build go build 构建约束对其中一个文件进行排除 。
首先在 inject.go 中加入如下的构建标签:
- 微软|电脑蓝屏先别慌!花1分钟看完:小白也能轻松解决
- 一、前言:时髦度拉满!真无线耳机也能RGB给你三四百元的预算|时髦度拉满!真无线耳机也能rgb
- excel|ECG+12天超长续航,华为智能手表表现迷人,穷人也能买得起
- dido|智能手环也能做专业健康监测?dido Y1健康监测手环时刻守护
- 薇娅被罚13.41亿后,其夫成立新公司做直播、演出经纪等
- 直播|被罚13.41亿后:薇娅老公亲自下场了
- 吃菜也能减碳了 首批零碳认证有机蔬菜上架盒马全国门店
- 华为|ECG+12天超长续航,华为智能手表表现迷人,穷人也能买得起
- 小米科技|手机听音乐不给力?选择HIFIMAN神仙组合,手机也能畅享顶级音效
- ios16|四款低价自拍旗舰推荐:精打细算,2000多元手机也能把自己拍美