使用uber fx提供接口

我正在尝试使用uber fx为 go 微服务项目进行依赖注入。

因为所有的微服务都需要构建一个基础服务器,并设置各种配置选项(常用中间件、缓冲区大小等)(我使用的是Fiber)。但是这些不同的微服务也有微服务独有的配置选项。也许是数据库连接字符串、jwt 键等。

我创建了一个接口,用于创建通用基础应用程序的共享函数,具有通用选项,但是任何需要依赖配置结构的函数都会失败,因为期望该微服务的配置的特定版本。

无法构建 *fiber.App:缺少函数“some-path/http”的依赖项。CreateServer(some-path/http/http.go:65):缺少类型:*http.Config 退出状态 1

最小的例子:

http/http.go

package http


import (

    "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.go

package config


import (

    "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)

}


慕无忌1623718
浏览 293回答 1
1回答

凤凰求蛊

你缺少*http.Config对象,创建一个返回该对象的函数,例如NewConfig()package httpimport (    "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),    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go