Golang依赖注入框架wire全攻略

您所在的位置:网站首页 数据库两张表同步更新 Golang依赖注入框架wire全攻略

Golang依赖注入框架wire全攻略

2024-03-26 20:50| 来源: 网络整理| 查看: 265

在前一阵介绍单元测试的系列文章中,曾经简单介绍过wire依赖注入框架。但当时的wire还处于alpha阶段,不过最近wire已经发布了首个beta版,API发生了一些变化,同时也承诺除非万不得已,将不会破坏API的兼容性。在前文中,介绍了一些wire的基本概况,本篇就不再重复,感兴趣的小伙伴们可以回看一下:搞定Go单元测试(四)—— 依赖注入框架(wire)。本篇将具体介绍wire的使用方法和一些最佳实践。

本篇中的代码的完整示例可以在这里找到:wire-examples

Installing go get github.com/google/wire/cmd/wire Quick Start

我们先通过一个简单的例子,让小伙伴们对wire有一个直观的认识。下面的例子展示了一个简易wire依赖注入示例:

$ ls main.go wire.go

main.go

package main import "fmt" type Message struct { msg string } type Greeter struct { Message Message } type Event struct { Greeter Greeter } // NewMessage Message的构造函数 func NewMessage(msg string) Message { return Message{ msg:msg, } } // NewGreeter Greeter构造函数 func NewGreeter(m Message) Greeter { return Greeter{Message: m} } // NewEvent Event构造函数 func NewEvent(g Greeter) Event { return Event{Greeter: g} } func (e Event) Start() { msg := e.Greeter.Greet() fmt.Println(msg) } func (g Greeter) Greet() Message { return g.Message } // 使用wire前 func main() { message := NewMessage("hello world") greeter := NewGreeter(message) event := NewEvent(greeter) event.Start() } /* // 使用wire后 func main() { event := InitializeEvent("hello_world") event.Start() }*/

wire.go

// +build wireinject // The build tag makes sure the stub is not built in the final build. package main import "github.com/google/wire" // InitializeEvent 声明injector的函数签名 func InitializeEvent(msg string) Event{ wire.Build(NewEvent, NewGreeter, NewMessage) return Event{} //返回值没有实际意义,只需符合函数签名即可 }

调用wire命令生成依赖文件:

$ wire wire: github.com/DrmagicE/wire-examples/quickstart: wrote XXXX\github.com\DrmagicE\wire-examples\quickstart\wire_gen.go $ ls main.go wire.go wire_gen.go

wire_gen.go wire生成的文件

// Code generated by Wire. DO NOT EDIT. //go:generate wire //+build !wireinject package main // Injectors from wire.go: func InitializeEvent(msg string) Event { message := NewMessage(msg) greeter := NewGreeter(message) event := NewEvent(greeter) return event }

使用前 V.S 使用后

... /* // 使用wire前 func main() { message := NewMessage("hello world") greeter := NewGreeter(message) event := NewEvent(greeter) event.Start() }*/ // 使用wire后 func main() { event := InitializeEvent("hello_world") event.Start() } ...

使用wire后,只需调一个初始化方法既可得到Event了,对比使用前,不仅减少了三行代码,并且无需再关心依赖之间的初始化顺序。

示例传送门: quickstart

Provider & Injector

provider和injector是wire的两个核心概念。

provider: a function that can produce a value. These functions are ordinary Go code. injector: a function that calls providers in dependency order. With Wire, you write the injector's signature, then Wire generates the function's body. github.com/google/wire…

通过提供provider函数,让wire知道如何产生这些依赖对象。wire根据我们定义的injector函数签名,生成完整的injector函数,injector函数是最终我们需要的函数,它将按依赖顺序调用provider。

在quickstart的例子中,NewMessage,NewGreeter,NewEvent都是provider,wire_gen.go中的InitializeEvent函数是injector,可以看到injector通过按依赖顺序调用provider来生成我们需要的对象Event。

上述示例在wire.go中定义了injector的函数签名,注意要在文件第一行加上

// +build wireinject ...

用于告诉编译器无需编译该文件。在injector的签名定义函数中,通过调用wire.Build方法,指定用于生成依赖的provider:

// InitializeEvent 声明injector的函数签名 func InitializeEvent(msg string) Event{ wire.Build(NewEvent, NewGreeter, NewMessage) //


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3