0. 简介
Wire 框架是利用依赖注入的方式实现控制反转的框架,与 Spring 有异曲同工之妙。那么,何为控制反转呢?控制反转是将对象创建的任务由程序的开发者转交给第三方的框架,以实现对象之间的解耦合。
1. 下载依赖
# Go >=1.16
go install github.com/google/wire/cmd/wire@latest
# Go < 1.16
go get github.com/google/wire/cmd/wire
2. Demo
新建一个go项目
go mod init wriedemo
新建一个model/wire.go文件,复制以下内容
//go:build wireinject
// +build wireinject
package model
import (
"fmt"
"github.com/google/wire"
)
type Object struct {
alived bool
}
type Person struct {
ob Object
name string
}
func NewObject(flg bool) Object {
return Object{
alived: flg,
}
}
func NewPerson(o Object, str string) Person {
return Person{
ob: o,
name: str,
}
}
func (p *Person) SayHi() string {
fmt.Println("Hello")
return "Hello"
}
func InitializePerson(msg string, flg bool) Person {
wire.Build(NewObject, NewPerson)
return Person{} //返回值没有实际意义,只需符合函数签名即可
}
在/model的文件夹中的终端运行如下命令
wire
会生成一个wire_gen.go文件 新建main/main.go文件,复制以下内容
package main
import . "wiredemo/model"
func main() {
person := InitializePerson("suta", true)
person.SayHi()
}
在终端运行
go mod tidy
之后启动main.go文件,输出Hello说明启动成功
3. 代码简单介绍
model.go
//go:build wireinject <- 这一行是告诉编译器,这个文件的代码已经交给wire托管了不需要编译执行
// +build wireinject
package model
// 下面的是简单规定了几个结构体,以及结构的的构造函数与一个简单方法
import (
"fmt"
"github.com/google/wire"
)
type Object struct {
alived bool
}
type Person struct {
ob Object
name string
}
func NewObject(flg bool) Object {
return Object{
alived: flg,
}
}
func NewPerson(o Object, str string) Person {
return Person{
ob: o,
name: str,
}
}
func (p *Person) SayHi() string {
fmt.Println("Hello")
return "Hello"
}
// 这一步是生成wire的 injector ,能够处理传入的各个构造函数的依赖关系
// 调用 wire 命令会生成wire_gen.go文件,我们后续调用的是gen文件,生成的gen文件我们不用修改
func InitializePerson(msg string, flg bool) Person {
wire.Build(NewObject, NewPerson) //绑定构造函数(wire里叫provider)
return Person{} //返回值没有实际意义,只需符合函数签名即可
}
main.go文件
package main
import . "wiredemo/model"
func main() {
person := InitializePerson("suta", true) // 调用gen文件里的injector,生成我们需要的对象
person.SayHi()
}
4. 总结
通过上面的Demo,我们已经能简单上手wire了!最基础的,wire框架能帮助我们解决对象创建之间的依赖问题。后续其他的API以及功能介绍,就放在后续的学习过程中了。