简介
Wire 是一个轻巧的 Golang 依赖注入工具。它由 Go Cloud 团队开发,通过自动生成代码的方式在编译期完成依赖注入。
Wire使用小例子源码结构说明
├─demo1 基本用法
├─demo2 接口绑定
├─demo3 结构体值注入
└─demo4 对错误的处理
使用说明
安装wire命令
go get github.com/google/wire/cmd/wire
这个只需要安装一次就可以了,没必要为每个项目都安装一次。
基本概念
provider
和injector
是wire
的两个核心概念。
provider
是普通的go函数,用它来产生指定对象的。因而这类函数必须是有返回值的。injector
是组织provider
函数按依赖顺序(不是参数传入顺序)生成对象的。此函数的最终目标是生成指定对象,因而必须要有返回值。但它的返回值是在代码生成时确定,编写injector
函数时返回值可以任意指定。(参考各demo下的wire.go
文件)
使用步骤
wire的使用大体上可以分为以下几步。
1 编写初始化函数
例:
// NewMessage 创建打招呼内容
func NewMessage() Message {
return Message("Hi there!")
}
此函数初始化了一个Message
结构体。这个函数的结果会作为下个函数的输入。如果初始化函数与的输入与输出与其他初始化函数都没关系,那么wire代码生成失败。
此类函数被称为provider
。
2 组织初始化函数流程
例:
// InitGreeteEvent1 使用 wire 生成初始化代码
func InitGreeteEvent1() Event {
wire.Build(NewEvent, NewGreeter, NewMessage)
return Event{} // 这里的返回值不重要。
}
此函数是组织一系列相关初始化函数的,并传入wire.Build
函数内进行代码生成。
这种函数被称为injector
。
这里有几点需要注意:
injector
函数需要写在wire.go
文件内。虽然文件名并非强制使用这个,但wire工具生成的文件名固定为wire_gen.go
,不想每次都改文件名就用这个吧。wire.go
文件必须加入//+build wireinject
注释,且它与package xxx
语句之间至少有一个空行。
3 生成代码
这里倒没什么好说的,命令行到指定目录下执行wire
命令就可以了。
官网上的例子都是在main
包下,别太死板,这个命令是可以到处执行的。
完
具体功能的使用可以参考各案例demo。