go 依赖注入工具( go-wire )使用(二 用户指南)
wire 有两个核心概念: 提供者与注入者
提供者providers
providers 是一个能够返回值的方法:
package foobarbaz
type Foo struct {
X int
}
func ProvideFoo() Foo {
return Foo{
X: 42}
}
type Bar struct {
X int
}
func ProvideBar(foo Foo) Bar {
return Bar{
X: -foo.X}
}
type Baz struct {
X int
}
func ProvideBaz(ctx context.Context, bar Bar) (Baz, error) {
if bar.X == 0 {
return Baz{
}, errors.New("cannot provide baz when bar is zero")
}
return Baz{
X: bar.X}, nil
}
这些都属于提供者。如果经常使用多个提供者,可以将它们放入提供者集合中:
var FooSet = wire.NewSet(ProvideFoo)
var SuperSet = wire.NewSet(FooSet, ProvideBar)
var ProviderSet = wire.NewSet(SuperSet, ProvideBaz)
// or
// var ProviderSet = wire.NewSet(ProvideFoo, ProvideBar, ProvideBaz)
集合可以 自由组合成为新的集合
注射者Injectors
init.go
package foobarbaz
import (
"context"
"github.com/google/wire"
)
func initializeBaz(ctx context.Context) (Baz, error) {
wire.Build(ProviderSet)
return Baz{
}, nil
}
func initializeBar(ctx context.Context) (Bar, error) {
wire.Build(ProviderSet)
return Bar{
}, nil
}
func initializeFoo(ctx context.Context) (Foo, error) {
wire.Build(ProviderSet)
return Foo{
}, nil
}
这时运行wire命令就能看到生成的wire_gen.go文件:
// Code generated by Wire. DO NOT EDIT.
//go:generate wire
//+build !wireinject
package foobarbaz
import