使用 google/wire 对 Go 项目进行依赖注入


当前第2页 返回上一页

wire 在实际项目中的使用步骤:

  1. 通过 wire.Bind 方法进行依赖声明,假设这部分代码放在 inject.go 文件中
  2. 使用 go generate 命令生成代码

go generate 需要通过 //go:generate 注释的方式使用,创建 wire_gen.go 文件并添加该注释:

//go:generate wire
  1. 在项目目录下执行 go generate 命令。
运行该命令时,它将扫描与当前包相关的源代码文件,找出所有包含 //go:generate 的特殊注释,提取并执行该特殊注释后面的命令。

至此,你就可以看到 wire_gen.go 里已经生成好 func setup(ctx context.Context) (sv *server.Server, clean func(), err error) 方法,方法体为依赖注入(对象创建)代码。

  1. 最后一步,在 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.gowire_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服务器有优势吗

cmd执行Golang乱码解决方法

Go是不是动态类型语言

Go 反射解析结构体标签tag

Go官方文档,我们能得到哪些资料?

Golang 踩坑时间parse转换后加8小时

Go 执行命令获取结果 Golang os/exec stdoutpipe stdinpipe

Go time 包中的 adddate 的逻辑避坑指南

Go 大数据生态迎来重要产品 cds

Golang命令Go env

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...