Wire
要求
在main包下,创建wire.go
在内部随便建立func方法,内部要包含wire.Build()
里面为对应的构造器函数。可以通过wire.Newset()
将多个Provider函数串联一起(之间不一定有关系),然后触发wire.Build调用。如果有全局要使用的对象,可以使用wire.Value
定义(仅针对对象)。且这种对象需要通过指针传递,否则要么提示找不到,要么提示重复了。
wire.go
type AppInfo struct{
}
func myWire(test *Test){
appInfo := &AppInfo{}
wire.Build(ServiceProvider, NewConfigService,wire.value(appInfo))
}
main.go
// 在需要初始化执行时,触发此方法装载。即wire仅是帮你生成了依赖关系的代码,还需要自己调用。
对于方法中的入参项,会在对象构建时,自动填入
myWire(&test)
service.go
ServiceProvider := wire.NewSet(NewUserService)
注意事项
wire对象的引用问题
wire没法调试,有时报出来的错和实际不一致,很是麻烦。有一点需要注意。
- 引用方和使用方引用一致
也就是如果构造返回的是引用地址,则使用方入参项也必须是引用地址,要么是具体对象
比如引用:
type A struct{}
func NewA() *A{ //A吐出去的是引用地址
return &A{}
}
type B struct{}
func NewB(a *A) B{ //此处需要使用A的引用地址
return B{}
}
func NewC(b B) //此处需要使用B的构造器,因B返回的是构造器对象
为了防止引用混乱,当有好多时会导致引用混乱。可以通过接口的方式,这样就屏蔽了内部具体是返回地址还是构造器对象
type A interface{}
type a struct{
A
}
func NewA() A{
return a{} // 直接结构体可以
return &a{} // 引用地址也可以
}
func NewB(a A)
执行
当执行wire
后,成功时会生成wire_gen.go文件。
windows用户,需要在git的工具中执行,windows自有控制台不可以执行会报错