亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用uber fx提供接口

使用uber fx提供接口

Go
慕無忌1623718 2022-11-15 17:10:16
我正在嘗試使用uber fx為 go 微服務項目進行依賴注入。因為所有的微服務都需要構建一個基礎服務器,并設置各種配置選項(常用中間件、緩沖區大小等)(我使用的是Fiber)。但是這些不同的微服務也有微服務獨有的配置選項。也許是數據庫連接字符串、jwt 鍵等。我創建了一個接口,用于創建通用基礎應用程序的共享函數,具有通用選項,但是任何需要依賴配置結構的函數都會失敗,因為期望該微服務的配置的特定版本。無法構建 *fiber.App:缺少函數“some-path/http”的依賴項。CreateServer(some-path/http/http.go:65):缺少類型:*http.Config 退出狀態 1最小的例子:http/http.gopackage httpimport (    "time"    "github.com/gofiber/fiber/v2")type BaseConfig interface {    GetPort() string    GetTimeout() int}type Config struct {    Port           string `env:"LISTEN_ADDR" envDefault:":3000"`    Timeout        uint64 `env:"TIMEOUT" envDefault:"10"`}func (c *Config) GetPort() string {    return c.Port}func (c *Config) GetTimeout() int {    return int(c.Timeout)}func CreateServer(config *Config) *fiber.App {    fiberConfig := fiber.Config{        ReadTimeout:    time.Second * time.Duration(config.GetTimeout()),        WriteTimeout:   time.Second * time.Duration(config.GetTimeout()),    }    app := fiber.New(fiberConfig)    // do setup and other stuff    return app}一些服務/配置/config.gopackage configimport (    "github.com/caarlos0/env/v6"    "github.com/rs/zerolog/log")type Config struct {    Port                string        `env:"LISTEN_ADDR" envDefault:":3000"`    Timeout             uint64        `env:"TIMEOUT" envDefault:"10"`    // some service specific stuff as well}func Parse() (*Config, error) {    cfg := Config{}    if err := env.Parse(&cfg); err != nil {        return nil, err    }    return &cfg, nil}func (c *Config) GetPort() string {    return c.Port}func (c *Config) GetTimeout() int {    return int(c.Timeout)}
查看完整描述

1 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

你缺少*http.Config對象,創建一個返回該對象的函數,例如NewConfig()


package http


import (

    "time"


    "github.com/caarlos0/env/v6"

    "github.com/gofiber/fiber/v2"

)


type BaseConfig interface {

    GetPort() string

    GetTimeout() int

}


type Config struct {

    Port    string `env:"LISTEN_ADDR" envDefault:":3000"`

    Timeout uint64 `env:"TIMEOUT" envDefault:"10"`

}


func NewConfig() (*Config, error) {

    cfg := Config{}


    if err := env.Parse(&cfg); err != nil {

        return nil, err

    }


    return &cfg, nil

}


func (c *Config) GetPort() string {

    return c.Port

}


func (c *Config) GetTimeout() int {

    return int(c.Timeout)

}


func CreateServer(config *Config) *fiber.App {

    fiberConfig := fiber.Config{

        ReadTimeout:  time.Second * time.Duration(config.GetTimeout()),

        WriteTimeout: time.Second * time.Duration(config.GetTimeout()),

    }


    app := fiber.New(fiberConfig)


    // do setup and other stuff


    return app

}

然后改變你的provideOptions(),也許是這樣的:


func provideOptions() []fx.Option {

    return []fx.Option{

        fx.Invoke(utils.ConfigureLogger),

        fx.Provide(config.Parse, http.NewConfig),

        fx.Invoke(controllers.SomeController),

        fx.Provide(http.CreateServer),

    }

}


查看完整回答
反對 回復 2022-11-15
  • 1 回答
  • 0 關注
  • 249 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號