使用google wire解决依赖注入
使用google wire解决依赖注入
google wire是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系。
当我们写代码的时候,都希望,类都是一个个独立的结构,互不耦合,而类之间的关系,是通过外部传递不同的依赖组件,来组装出来,生成不同的实例。
一个耦合的例子:
type BOB struct {
db *sql.DB
}
func NewBOB() *BOB{
return &BOB{
db: new(MysqlDB),
}
}
在例子中,BOB类会来依赖db类,而db类的生成,是通过new(MysqlDB)生成的,这样就把BOB和db类耦合起来了,如果要改变其他的数据库类,则需要改动BOB的代码了,这样是不合理的,因为BOB依赖的是DB,而不是MysqlDB,最好的方式,MysqlDB类改动了,但BOB代码不用改。
下面改一下代码,一个组装依赖的例子:
type BOB struct {
db *sql.DB
}
func NewBOB(db *sql.DB) *BOB{
return &BOB{
db: db,
}
}
func main(){
db := new(MysqlDB)
NewBOB(db)
}
在上面的例子里,原来的new(MysqlDB),替换为db: db,通过参数的方式来初始化db了,而类的组装是在main函数里面实现,使用这样组装,当MysqlDB改为XXDB的时候,BOB的代码不用变动,代码不用变动,出问题的几率就会少,这样的组装方式,就叫依赖注入了。
一般情况下,组装类的依赖关系,都可以手写,但平时写项目的时候,类的数量,很容易会有几十个,这个时候,如果手写的话,会很啰嗦麻烦,而且要理顺好生成的顺序。
为了解决依赖组装的问题,golang有uber的dig和Facebook的inject,这两个都是通过运行时注入的,使用运行时注入,会有一些问题,比如不好调试,错误提示不及时等,而wire采用不同的方式来实现,通过生成依赖注入的代码来解决问题,这样就和手写是一样的,只是减轻手写的麻烦。
wire可以通过类组装,结构体组装,还可以参数和异常返回,看看例子:
type Foo struct {
}
func NewFoo() *Foo{
return &Foo{}
}
type Bar struct {
foo *Foo
}
func NewBar(foo *Foo) *Bar {
return &Bar{
foo:foo,
}
}
func (p *Bar) Test(){
fmt.Println("hello")
}
wire.go:
package wire
import (
wire "github.com/google/wire"
)
type Instance struct {
Foo *Foo
Bar *Bar
}
var SuperSet = wire.NewSet(NewFoo, NewBar)
func InitializeAllInstance() *Instance {
wire.Build(SuperSet, Instance{})
return &Instance{}
}
执行wire命令,会读取到wire.NewSet里面的ProviderSet,通过分析各个函数的参数和返回值,来自行解决依赖,可以生成wire_gen.go:
func InitializeAllInstance() *Instance {
foo := NewFoo()
bar := NewBar(foo)
instance := &Instance{
Foo: foo,
Bar: bar,
}
return instance
}
总结
通过google wire能够让手写依赖关系变得简单,而且相当直观,值得推荐使用。
[参考资料]
使用google wire解决依赖注入的更多相关文章
- 使用ReflectionTestUtils解决依赖注入
概述 当使用junit来测试Spring的代码时,为了减少依赖,需要给对象的依赖,设置一个mock对象,但是由于Spring可以使用@Autoware类似的注解方式,对私有的成员进行赋值,此时无法 ...
- Go工程化 - 依赖注入
我们在微服务框架kratos v2的默认项目模板中kratos-layout使用了google/wire进行依赖注入,也建议开发者在维护项目时使用该工具. wire 乍看起来比较违反直觉,导致很多同学 ...
- 几个步骤轻松搞定ASP.NET 依赖注入。
http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注入的问题.但是每次新建一个依 ...
- JavaScript中依赖注入详细解析
计算机编程的世界其实就是一个将简单的部分不断抽象,并将这些抽象组织起来的过程.JavaScript也不例外,在我们使用JavaScript编写应用时,我们是不是都会使用到别人编写的代码,例如一些著名的 ...
- ASP.NET 依赖注入。
ASP.NET 依赖注入. http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注 ...
- JavaScript里的依赖注入
JavaScript里的依赖注入 我喜欢引用这句话,“程序是对复杂性的管理”.计算机世界是一个巨大的抽象建筑群.我们简单的包装一些东西然后发布新工具,周而复始.现在思考下,你所使用的语言包括的一些内建 ...
- spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异
为了探寻 '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Perso ...
- Google 开源的依赖注入库,比 Spring 更小更快!
Google开源的一个依赖注入类库Guice,相比于Spring IoC来说更小更快.Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式. 学习目标 概述: ...
- Compile-time Dependency Injection With Go Cloud's Wire 编译时依赖注入 运行时依赖注入
Compile-time Dependency Injection With Go Cloud's Wire - The Go Blog https://blog.golang.org/wire Co ...
随机推荐
- Oracle 中DATE类型的计算
select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate,1) f ...
- 关于阿里云ECS服务器修改远程端口的一点总结
般修改公司的远程服务器的登录端口号分为两大步: 一.修改注册表中的两个地方的端口号:(注册表打开命令:regedit) [HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro ...
- 《Linux就该这么学》第十三天课程
使用Apache服务部署静态网站 原创地址:https://www.linuxprobe.com/chapter-10.html 今天学了Apache,这只是RHCE课程的开始,估计后面越来越难 今天 ...
- laravel 打印完整sql
DB::connection()->enableQueryLog(); // 开启QueryLog \App\User::find(1); dump(DB::getQueryLog());
- 学以致用三十三-----django生命周期
听了讲解django的视频后,受益匪浅,每个知识点老师都会总结整理.学会总结,存为己用. django生命周期弄明白后,对于整个django的框架会有一个清晰的了解.先上图 1.客户端发送请求,在dj ...
- [swarthmore cs75] Lab 0 Warmup & Basic OCaml
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下 ...
- jmeter+ant+jenkins接口自动化环境搭建
一.准备 1.安装jdk --->点击查看安装教程 2.安装jmeter ,官网下载jmeter解压,配置jmeter环境: JMETER_HOME (解压jdk路径) Path (;% ...
- PHP单一文件入口框架简析
<?php /** * PHP单一文件框架设计简析 * 1.MVC架构实现 * 2.URL路由原理 */ //URL路由原理 /** * 路由作用 * 获取url中的c和a变量,执行c类对应的方 ...
- window下载android 最新源码
https://blog.csdn.net/jason0539/article/details/24010633 2017方法 ok https://www.cnblogs.com/zhangting ...
- 基于MFC的socket编程
网络编程 1.windows 套接字编程(开放的网络编程接口)添加头文件#include<windows.h> 2.套接字及其分类 socket分为两种:(1)数据报socket:无连接套 ...