cmakelist 库依赖库_Go 每日一库之 Uber 的依赖注入库 dig

简介

今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。

快速使用

第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装:

$ go get go.uber.org/dig
$ go get gopkg.in/ini.v1
$ go get github.com/jessevdk/go-flags

下面看看如何使用:

package main

import (
"fmt"

"github.com/jessevdk/go-flags"
"go.uber.org/dig"
"gopkg.in/ini.v1"
)

type Option struct {
ConfigFile string `short:"c" long:"config" description:"Name of config file."`
}

func InitOption() (*Option, error) {
var opt Option
_, err := flags.Parse(&opt)

return &opt, err
}

func InitConf(opt *Option) (*ini.File, error) {
cfg, err := ini.Load(opt.ConfigFile)
return cfg, err
}

func PrintInfo(cfg *ini.File) {
fmt.Println("App Name:", cfg.Section("").Key("app_name").String())
fmt.Println("Log Level:", cfg.Section("").Key("log_level").String())
}

func main() {
container := dig.New()

container.Provide(InitOption)
container.Provide(InitConf)

container.Invoke(PrintInfo)
}

在同一目录下创建配置文件my.ini

app_name = awesome web
log_level = DEBUG

[mysql]
ip = 127.0.0.1
port = 3306
user = dj
password = 123456
database = awesome

[redis]
ip = 127.0.0.1
port = 6381

运行程序,输出:

$ go run main.go -c=my.ini
App Name: awesome web
Log Level: DEBUG

dig库帮助开发者管理这些对象的创建和维护,每种类型的对象会创建且只创建一次dig库使用的一般流程:

  • 创建一个容器:dig.New
  • 为想要让dig容器管理的类型创建构造函数,构造函数可以返回多个值,这些值都会被容器管理;
  • 使用这些类型的时候直接编写一个函数,将这些类型作为参数,然后使用container.Invoke执行我们编写的函数。

参数对象

有时候,创建对象有很多依赖,或者编写函数时有多个参数依赖。如果将这些依赖都作为参数传入,那么代码将变得非常难以阅读:

container.Provide(func (arg1 *Arg1, arg2 *Arg2, arg3 *Arg3, ....) {
    
// ...
})

dig支持将所有参数打包进一个对象中,唯一需要的就是将dig.In内嵌到该类型中:

type Params {
    
dig.In

Arg1 *Arg1
Arg2 *Arg2
Arg3 *Arg3
Arg4 *Arg4
}

container.Provide(func (params Params) *Object {
// ...
})

内嵌了dig.In之后,dig会将该类型中的其它字段看成Object的依赖,创建Object类型的对象时,会先将依赖的Arg1/Arg2/Arg3/Arg4创建好。

package main

import (
"fmt"
"log"

"github.com/jessevdk/go-flags"
"go.uber.org/dig"
"gopkg.in/ini.v1"
)

type Option struct {
ConfigFile string `short:"c" long:"config" description:"Name of config file."`
}

type RedisConfig struct {
IP string
Port i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Go语言中,`dig.In`是`go-dig`中的一个函数,用于依赖注入依赖注入是一种软件设计模式,它的目的是减少代码之间的耦合性,并提高代码的可测试性和可维护性。在Go语言中,`dig.In`函数是`go-dig`提供的一个依赖注入功能的入口。 使用`dig.In`函数可以将需要注入的依赖项声明在一个结构体中,并在需要使用这些依赖项的地方进行注入。下面是一个简单的示例: ```go package main import ( "fmt" "go.uber.org/dig" ) type Database struct { // 数据相关的成员 } type Service struct { Database *Database } func NewService(database *Database) *Service { return &Service{ Database: database, } } func main() { container := dig.New() err := container.Provide(func() *Database { return &Database{} }) if err != nil { fmt.Println("Failed to provide database:", err) return } err = container.Invoke(func(service *Service) { // 使用注入的Service实例 }) if err != nil { fmt.Println("Failed to invoke service:", err) return } } ``` 在上面的示例中,我们首先创建了一个`Database`结构体作为依赖项,然后创建了一个`Service`结构体,并将`Database`注入到`Service`中。最后,通过调用`container.Invoke`函数,`Service`的实例将被注入并传递给回调函数。 请注意,上述示例只是演示了`dig.In`的基本用法。实际使用中,您可能会有更复杂的依赖关系,并且需要在容器中注册更多的提供者和调用函数。您可以在`go-dig`的文档中了解更多详细信息和高级用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值