google/wire 是 Go 语言的编译时依赖注入框架,与 Spring IoC 一样,wire 的目的也是让开发者从对项目中大量依赖的创建和管理中解脱出来,但两者在实现方式上有着很大的不同。
Go 中的依赖注入
在 Go 中,我们通常采取在构造函数中传入依赖的方式创建对象:
func main() {
NewUserStore(conf.Load(),db.InitMySQL())
}
func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore, error) {
...}
这在小规模项目中效果很好,但当项目规模变大时,单个对象的创建往往需要多个依赖,而这些依赖通常还有它自己的依赖,这就导致对象的创建变得繁琐,容易出错。
wire 如何完成依赖注入
在开发中,我们创建对象的过程可以分为两步:
- 定义结构体的构造函数
func NewUserStore(cfg *Config, db *mysql.DB) (*UserStore,