前言
fx 是 Golang 有一个很强大的依赖注入框架,能够提供强大的适配 Golang 语言特性的依赖注入。
使用 Golang 中并不强大反射由顶到底的进行注入。正如 readme 中提到的优点:
消除全局状态:Fx 帮助您从应用程序中删除全局状态。不再init()有全局变量。使用 Fx 管理的单例。
代码重用:Fx 允许组织内的团队构建松散耦合且集成良好的可共享组件。
久经考验:Fx 是 Uber 几乎所有 Go 服务的支柱。
fx 框架在各种场景下大量运用
问题
由于 fx 框架默认使用反射来区分,所以如果遇到同类型的变量,fx 就不能正确识别。但是 fx 已经考虑到这种场景,提供了Named Values标记变量,我这里给出一个例子,方便以后查找。
例子
文档在这里 Named Values
package main
import (
"fmt"
"go.uber.org/fx"
)
type Foo struct {
NameA string `name:"a"`
NameB string `name:"b"`
}
type Para struct {
fx.In
NameA string `name:"a"`
NameB string `name:"b"`
}
// MyObject对象的提供者函数
func NewMyObject(p Para) *Foo {
return &Foo{
NameA: p.NameA,
NameB: p.NameB,
}
}
type namedStrings struct {
fx.Out
A string `name:"a"`
B string `name:"b"`
}
func main() {
app := fx.New(
// Supply 和 Provide 函数2选1
fx.Supply(namedStrings{A: "Hello", B: "World"}), // Supply the named strings
// 注册提供者函数
fx.Provide(
// func() namedStrings { return namedStrings{A: "Hello", B: "World"} }, // Provide the named strings
NewMyObject, // 注册MyObject对象的提供者函数
),
fx.Invoke(
func(object *Foo) {
fmt.Println(object.NameA) // 打印"Hello"
fmt.Println(object.NameB) // 打印"World"
},
),
)
app.Run()
}