wire 在实际项目中的使用步骤:
- 通过
wire.Bind
方法进行依赖声明,假设这部分代码放在inject.go
文件中 - 使用 go generate 命令生成代码
go generate
需要通过 //go:generate
注释的方式使用,创建 wire_gen.go
文件并添加该注释:
//go:generate wire
- 在项目目录下执行
go generate
命令。
运行该命令时,它将扫描与当前包相关的源代码文件,找出所有包含 //go:generate
的特殊注释,提取并执行该特殊注释后面的命令。
至此,你就可以看到 wire_gen.go
里已经生成好 func setup(ctx context.Context) (sv *server.Server, clean func(), err error)
方法,方法体为依赖注入(对象创建)代码。
- 最后一步,在 main 方法中调用
setup
方法(这里假设我们的项目是一个提供 RESTful 接口的 HTTP 服务)
package main
func main() {
ctx := context.Background()
srv, cleanup, err := setupGCP(ctx)
if err != nil {
log.Fatalf("failed to setup the server, got error: %s", err)
}
defer cleanup()
log.Fatal(srv.ListenAndServe(":8080"))
}
需要注意的是,如果 inject.go
和 wire_gen.go
在同一个 package 下,那此时 IDE 会提示语法错误,因为两个文件下存在方法签名一样的两个方法。此时可以使用 //+build go build
构建约束对其中一个文件进行排除。
首先在 inject.go
中加入如下的构建标签:
//+build wireinject
然后在 wire_gen.go
中加入构建约束使 go build
时排除带 wireinject
标签的文件:
//+build !wireinject
使用 wire.Bind, wire.Value 等方法声明和组织依赖
wire 在 go generate
扫描代码时从 wire.Bind
中提取项目依赖关系并为我们生成依赖注入代码,那我们要怎样将依赖关系更高效,清晰的“告知”给 wire 呢?
wire 提供了几个函数帮助我们组织和声明项目中的依赖关系:
wire.Bind
: 将接口和其实现进行绑定wire.Value
: 将值(实例)包装为依赖
...
更详细的文档可以在 这里 查看。
本文来自:Segmentfault
感谢作者:.container .card .information strong
查看原文:使用 google/wire 对 Go 项目进行依赖注入
相关阅读 >>
锁的使用场景主要涉及到哪些?读写锁为什么会比普通锁快【Golang 入门系列十六】
更多相关阅读请进入《Go》频道 >>

Go语言101
一个与时俱进的Go编程知识库。