網頁

2023/11/1

Golang uber Fx ParamTags, ResultTags name tag

Go語言依賴套件uber-go/fxParamTagsResultTags 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,
    }
}

github



測試

執行程式後輸出以下:

[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

沒有留言:

張貼留言