Go語言依賴套件uber-go/fx
的ParamTags
和ResultTags
name tag用法。
當依賴的多個參數類型相同時,可使用fx.ParamTags(`name:"...", ...`)
標註注入參數值的名稱來區別,分別對映到fx.ResultTags(`name:"...", ...`)
返回實例的標註名稱。tag的順序符合參數位置順序。
範例環境:
- Go 1.19
事前要求
參考「Golang uber Fx 依賴注入套件 簡單範例」了解Fx基本用法。
範例
main.go
package main
import (
"fmt"
"go.uber.org/fx"
)
func NewString1() string {
s := string("foo")
return s
}
func NewString2() string {
s := string("bar")
return s
}
func main() {
fx.New(
fx.Provide(
fx.Annotate(
NewString1,
fx.ResultTags(`name:"s1"`),
),
),
fx.Provide(
fx.Annotate(
NewString2,
fx.ResultTags(`name:"s2"`),
),
),
fx.Provide(
fx.Annotate(
NewA,
fx.ParamTags(`name:"s1"`, `name:"s2"`),
),
),
fx.Invoke(func(a *A) {
fmt.Println("invoke")
}),
).Run()
}
type A struct {
S1 string
S2 string
}
func NewA(s1, s2 string) *A {
fmt.Printf("create A with s1=[%s], s2=[%s]\n", s1, s2)
return &A{
S1: s1,
S2: s2,
}
}
測試
執行程式後輸出以下:
[Fx] PROVIDE string[name = "s1"] <= fx.Annotate(main.NewString1(), fx.ResultTags(["name:\"s1\""])
[Fx] PROVIDE string[name = "s2"] <= fx.Annotate(main.NewString2(), fx.ResultTags(["name:\"s2\""])
[Fx] PROVIDE *main.A <= fx.Annotate(main.NewA(), fx.ParamTags(["name:\"s1\"" "name:\"s2\""])
[Fx] PROVIDE fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] INVOKE main.main.func1()
[Fx] RUN provide: fx.Annotate(main.NewString1(), fx.ResultTags(["name:\"s1\""])
[Fx] RUN provide: fx.Annotate(main.NewString2(), fx.ResultTags(["name:\"s2\""])
create A with s1=[foo], s2=[bar]
[Fx] RUN provide: fx.Annotate(main.NewA(), fx.ParamTags(["name:\"s1\"" "name:\"s2\""])
invoke
[Fx] RUNNING
沒有留言:
張貼留言