跳至正文
Wener Notes

fx

约 1 分钟阅读
    • 基于反射的动态 IoC 容器
    • 内部为 - DI
  • fx.Supply 不能直接提供 interface
    • Go 类型检测不到, 使用 constructor 返回
  • fx.In 和 fx.Out 要求字段 exported
  • 不支持 lazy - 面向启动时初始化设计,而非请求时配置

使用 IoC 可能导致维护性变差

使用 fx 作为 container 虽然当时使用时构建起来容易,但是一段时间后再理解逻辑需要一定时间。

替代选择:

  • Service Context 对象 - 包含所有的依赖信息,透明
  • 选择 - 编译时生成
go
type HandlerParams struct {
  fx.In // consume - 多入参 - 增强可读性

  Users    *UserGateway
  Comments *CommentGateway
  Posts    *PostGateway
  Votes    *VoteGateway
  AuthZ    *AuthZGateway

  Cache *redis.Client `optional:"true"` // 可选参数

  WriteToConn  *sql.DB `name:"rw"`      // 命名
  ReadFromConn *sql.DB `name:"ro" optional:"true"`

  Handlers []Handler `group:"server"`   // 多实例 - 不保证顺序
}

type ConnectionResult struct {
  fx.Out // provide

  ReadWrite *sql.DB `name:"rw"`
  ReadOnly  *sql.DB `name:"ro"`

  Handler Handler `group:"server"`

  Handler []int `group:"server"`         // Consume as [][]int
  Handler []int `group:"server,flatten"` // Consume as []int
}

func NewConnection(p HandlerParams) ConnectionResult {
  // ...
}

// 可以直接使用 Annotated 配置名字和分组
fx.Provide(fx.Annotated{
  Name: "ro",
  Group: "server",
  Target: NewReadOnlyConnection,
})

关联信息

反向链接、本文链接的其他页面和外部资料。

反向链接

  • Go Awesome
    笔记 · fx

    https://go-proverbs.github.io/ · mux · chi - ⭐️ · gin, mux · ORM · gorm - ⭐️ · 基于反射 · 目前 Go 里实现最为优美的 ORM · XORM 被 gogs 和 gitea 使用,是 gogs 原作者开发 - 但认为比不上 gorm

  • wire
    笔记 · fx

    项目进入维护状态 · google/wire · Compile-time DI · 编译时生成 DI 逻辑 · 逻辑清晰明确 · 不是 IoC 容器 · 透明 - IoC 容器是一个不透明的盒子 · 替代 · uber fx, dig

站内链接

  • wire
    笔记 · wire

    项目进入维护状态 · google/wire · Compile-time DI · 编译时生成 DI 逻辑 · 逻辑清晰明确 · 不是 IoC 容器 · 透明 - IoC 容器是一个不透明的盒子 · 替代 · uber fx, dig

参考资料

GitHub2 条
最近更新commit 32faea0编辑