跳至正文
首页 » Golang fx依赖注入框架 Named Values 使用

Golang fx依赖注入框架 Named Values 使用

前言

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()
}
标签:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注