在上一篇文章当中我们讲到了项目的目录结构,大体上水平切分为了四层,然后再根据需要进行垂直切分,然后由于我们大量的使用到了接口和依赖注入的手段,所以在项目初始化的时候如果手动进行依赖关系的初始化会比较麻烦,这时候就需要用到依赖注入的框架了。

在刚开始接触 go 的那一段时间,我是比较排斥使用太多框架的,觉得保持简单更加重要,这种想法在很长一段时间(大概两年左右)都没有问题,直到正式工作一段时间之后发现,随着开发合作的同学的增多以及部门的要求增加,项目启动时的依赖越来越多,依赖之间还有先后顺序,有一些甚至是隐式的顺序,到时 main 函数的代码膨胀的非常迅速并且慢慢的变的不可维护了,这种情况下引入依赖注入框架其实可以省心很多。

Golang 的依赖注入框架有两类,一类是通过反射在运行时进行依赖注入,典型代表是 uber 开源的 dig,另外一类是通过 generate 进行代码生成,典型代表是 Google 开源的 wire。使用 dig 功能会强大一些,但是缺点就是错误只能在运行时才能发现,这样如果不小心的话可能会导致一些隐藏的 bug 出现。使用 wire 的缺点就是功能限制多一些,但是好处就是编译的时候就可以发现问题,并且生成的代码其实和我们自己手写相关代码差不太多,更符合直觉,心智负担更小,所以我更加推荐 wire,如果对 dig 感兴趣可以跳转到文章参考文献处跳转查阅。

本文分为两个部分,首先介绍 wire 的使用方法,然后是结合上一篇文章中的工程目录,我在使用 wire 过程中的一些 “最佳实践” 避免大家重复踩坑。

wire 使用教程
如果你对 wire 已经比较熟悉可以直接跳过这一部分,阅读完本文之后建议对照看一下官方文档再进行操作。
注:本文基于 wire 0.5.0 进行编写
安装
安装很简单,只要安装了 Go 并且已经把 $GOPATH/bin 加入到了 PATH 当中,终端执行下面的语句即可

1
go get github.com/google/wire/cmd/wire
Provider
正式开始前需要先了解一下 wire 当中的两个概念:provider 和 injector

Provider 是一个普通的函数,这个函数会返回构建依赖关系所需的组件。如下所示,就是一个 provider 函数,在实际使用的时候,往往是一些简单的工厂函数,这个函数不会太复杂。

1
2
// NewPostRepo 创建文章 Repo
func NewPostRepo() IPostRepo {}
不过需要注意的是在 wire 中不能存在两个 provider 返回相同的组件类型

Injector
injector 也是一个普通函数,我们常常在 wire.go 文件中定义 injector 函数签名,然后通过 wire 命令自动生成一个完整的函数

1
2
3
4
5
//+build wireinject

func GetBlogService() *Blog {
panic(wire.Build(NewBlogService, NewPostUsecase, NewPostRepo))
}
第一行的 //+build wireinject 注释确保了这个文件在我们正常编译的时候不会被引用,而 wire . 生成的文件 wire_gen.go 会包含 //+build !wireinject 注释,正常编译的时候,不指定 tag 的情况下会引用这个文件

wire.Build 在 injector 函数中使用,用于表名这个 injector 由哪些 provider 提供依赖, injector 函数本身只是一个函数签名,所以我们直接在函数中 panic 实际生成代码的时候并不会直接调用 panic

一个完整的

依赖注入框架 wire相关推荐

  1. android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...

  2. 依赖注入框架Autofac学习笔记

    Autofac是一个轻量级的依赖注入框架,可以在这里面下载:http://code.google.com/p/autofac/downloads/list 要想了解什么是依赖注入,可以参考下这篇博客: ...

  3. Android:dagger2让你爱不释手-基础依赖注入框架篇

    前言 dagger2的大名我想大家都已经很熟了,它是解决Android或java中依赖注入的一个类库(DI类库).当我看到一些开源的项目在使用dagger2时,我也有种匆匆欲动的感觉,因此就立马想一探 ...

  4. 深入浅出依赖注入框架Dagger2

    目录 目录 依赖注入 依赖注入实现的三种方式 1. 构造注入 2. 属性注入 3. 接口注入 Dagger2 Dagger2的引入 不带Module的Inject方式(Inject+Component ...

  5. 依赖注入的三种方式_ASP.NET Core技术研究-探秘依赖注入框架

    ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...

  6. Kotlin替换Dagger2/Hilt的依赖注入框架--Koin。

    Koin.Dagger2.Hilt 目前都是非常流行的库,面对这么多层出不穷的新技术,我们该做如何选择,是一直困扰我们的一个问题. Hilt 与 Dagger2 区别并不大,Hilt就是对Dagger ...

  7. ASP.NET Core技术研究-探秘依赖注入框架

    ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...

  8. 给微软的依赖注入框架写一些扩展方法

    给微软的依赖注入框架写一些扩展方法 Intro 现在在项目里大多都是直接使用微软的依赖注入框架,而微软的注入方式比较简单,不如 AutoFac 使用起来灵活,于是想给微软的依赖注入增加一些扩展,使得可 ...

  9. 依赖注入:一个Mini版的依赖注入框架

    前面的章节中,我们从纯理论的角度对依赖注入进行了深入论述,我们接下来会对.NET Core依赖注入框架进行单独介绍.为了让读者朋友能够更好地理解.NET Core依赖注入框架的设计与实现,我们按照类似 ...

最新文章

  1. 【C#】VS2012+InstallShield2013制作软件更新包
  2. linux 刻录cd,Linux 刻录CD/DVD命令 growisofs/mkisofs/cdrecord
  3. LeetCode 258. 各位相加
  4. 庆国庆,Power BI 统一报表门户横空出世,指南请收
  5. 利用栈来处理大数加法
  6. 敏捷开发免费管理工具——火星人预览之七:自定义字段
  7. Firefox 67不能勾选“以后自动采用相同的动作处理此类文件”解决方案
  8. UVA 1324 The Largest Clique 最大团(强连通分量,变形)
  9. 模拟微信发红包算法java实现
  10. hibernate二级缓存(二)二级缓存实现原理简单剖析
  11. 使用BCDboot工具,修复windows 系统启动,双启动菜单丢失故障
  12. ZXPInstaller for Mac(PS扩展安装器)免费版
  13. Fiddler抓包工具抓取手机APP数据
  14. HyperLPR车牌识别算法学习
  15. php 数据库 编程,php数据库编程(mysql mysqli pdo)
  16. 微信收到消息很慢无法连接服务器,微信消息总是延迟接收怎么办?
  17. emacs命令/edwin参考
  18. 硬币组合问题-非递归实现
  19. C语言实现扫描文件下所有目录
  20. 电话程控交换机 配置

热门文章

  1. Java延时队列DelayedQueue
  2. Spring容器,控制反转,依赖注入
  3. ES5(一)——保护对象
  4. java.sql.SQLException: Parameter index out of range (5 > number of parameters, which is 4).
  5. Android Studio 导入 AOSP 源码 1
  6. Scrum立会报告+燃尽图(十月二十四日总第十五次)
  7. 卡尔曼滤波器实例:进一步讨论自由落体运动
  8. 国外博客透露JavaFX 2.0路线图
  9. 新浪病毒NMGameX_AutoRun引起全公司所有打印共享器无法使用
  10. Windows环境下JDK安装与环境变量配置详细的图文教程