Wire 框架(1)——零基础Demo上手

580 阅读2分钟

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以及功能介绍,就放在后续的学习过程中了。