路人战队|Facebook 在 Golang 依赖注入的实现
依赖注入是一个经典的设计模式 , 在解决复杂的对象依赖关系方面是一个非常行之有效的手段 。
对于有反射功能的语言来说 , 实现依赖注入都比较方便一些 。 在 Golang 中有几个比较知名的依赖注入开源库 , 例如 google/wire 、 uber-go/dig 以及 facebookgo/inject 等 。
本文将基于 facebookgo/inject 介绍依赖注入, 接下来将会着重讨论以下几点内容:
- 依赖注入的背景以及解决的问题
- facebookgo/inject 的使用方法
- facebookgo/inject 的缺陷
以一个常见的 HTTP 服务为例 , 我们在开发后台时往往会把代码分为 Controller、Service 等层次 。 如下:
type UserController struct {UserService *UserServiceConf*Conf}type PostController struct {UserService *UserServicePostService *PostServiceConf*Conf}type UserService struct {Db*DBConf *Conf}type PostService struct {Db *DB}type Server struct {UserApi *UserControllerPostApi *PostController}上述的代码例子中 , 有两个 Controller:UserController 和 PostController , 分别用来接收用户和文章的相关请求逻辑 。 除此之外还会有 Service 相关类、Conf 配置文件、DB 连接等 。这些对象之间存在比较复杂的依赖关系 , 这就给项目的初始化带来了一些困扰 。 对于以上代码 , 对应初始化逻辑大概就会是这样:
func main() {conf := loadConf()db := connectDB()userService :=err != nil {panic(err)}if err := graph.Populate(); err != nil {panic(err)}server.Run()}- 首先每一个需要注入的字段都需要打上 inject:"" 这样的 tag 。 所谓依赖注入 , 这里的依赖指的就是对象中包含的字段 , 而注入则是指有其它程序会帮你对这些字段进行赋值 。
- 其次 , 我们使用 inject.Graph{} 创建一个 graph 对象 。 这个 graph 对象将负责管理和注入所有的对象 。 至于为什么叫 Graph , 其实这个名词起的非常形象 , 因为各个对象之间的依赖关系 , 也确实像是一张图一样 。
- 接下来 , 我们使用 graph.Provide() 将需要注入的对象提供给 graph。 graph.Provide(
- 最后调用 Populate 函数 , 开始进行注入 。
但是其他的对象呢? 例如 UserApi 和 UserService 呢?我们并没有向 graph 调用 Provide 过 。 那么它们是怎么完成赋值和注入的呢?
其实从下面这张对象依赖图能够很简单的看清楚 。
我们需要提供给 Graph 的就是根节点和叶子节点 , 对于中间节点来说 , Graph 会通过 inject:"" 标签 , 自动将其 Provide 到 Graph 中 , 并进行注入 。
对以上例子 , 我们深入剖析下 Graph 内部进行 Populate 时都发生了哪些动作:
- Graph 首先解析 server 对象 , 发现其有两个标记为 inject 的字段: UserApi 和 PostApi。 其类型 UserController 和 PostController , Graph 中从未出现过这两个类型 。 因此 , Graph 会自动对该字段调用 Provide , 提供给 Graph 。
推荐阅读
- 大河客户端|布局战队,导师各有妙招,《2020中国好声音》收视率蝉联第一
- 周到|“好声音”蝉联省级卫视综艺节目收视第一,首迎抢位战导师布局战队各有妙招
- 通天战队|A股最励志闻泰科技!给华为小米打工到半导体巨头,半年赚17亿
- 阿文带你看足球|高颜值身材傲人,路人王一役走红网络,她是“篮球界江疏影”
- 阿文带你看足球|她是“篮球界江疏影”,高颜值身材傲人,路人王一役走红网络
- 倪妮|倪妮身材什么程度?拍戏被路人偶遇,未P图暴露驼背“筋肉腿”
- |《街舞3》火舞台battle开启 钟汉良战队团魂之力势不可挡
- |《这!就是街舞》第三季火舞台热力喷发,队长领衔齐舞大秀燃炸战队之魂
- 绅士老司机|吴昕的A字裙造型生图流出,在路人镜头下,100斤的腿太真实
- 巅峰战队|ConcurrentHashMap的部分源码分析
