为了账号安全,请及时绑定邮箱和手机立即绑定

使用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 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信