gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/
文章目录
- 优化和新特性
- gone 核心功能增强
- 内置Goners
- 覆盖测试
- 后续计划
优化和新特性
gone 核心功能增强
-
重构了函数参数依赖注入
在Cemetery上提供了InjectFuncParameters
方法,用于完成函数参数的依赖注入。该方法的定义如下:
InjectFuncParameters(fn any,injectBefore func(pt reflect.Type, i int) any,injectAfter func(pt reflect.Type, i int), ) (args []reflect.Value, err error)
- 入参说明:
- fn,需要被注入的函数;函数允许拥有多个入参,入数可以是Gone框架中注册的接口或者结构体指针,也可以为被
gone
标记了属性的结构体,一般使用匿名结构体; - injectBefore,hook函数,在对第i个参数构造前调用,如果
injectBefore(x, i)
返回值非nil,InjectFuncParameters将不再构造fn函数的第i
个参数,而是将该值的reflect.Value
直接作为args数组的第i个值; - injectAfter,hook函数,在对第i个参数成功构造后调用;
- fn,需要被注入的函数;函数允许拥有多个入参,入数可以是Gone框架中注册的接口或者结构体指针,也可以为被
- 出参说明
- args,fn参数的
reflect.Value
数组 - err,函数构造返回的错误
- args,fn参数的
- 功能说明:
根据fn函数的定义和Gone框架中注册的Goners,自动构造fn的参数数组args。然后可以使用func (v Value) Call(in []Value) []Value
对函数进行调用。
- 入参说明:
-
引入了gone.GonerOption接口,用于给
Bury
提供选项。- gone.GonerId,在Bury时给Goner提供GonerId
- gone.Order,在Bury时给Goner提供一个序号;可以用于明确定义Goners的加载顺序和hook函数的执行顺序。
- gone.IsDefault,在Bury时给Goner提供默认的接口类型,后续我们将另外些一篇博客介绍该特性。
-
调整了Cemetery上
Bury*
方法支持gone.GonerOption接口,包括:Bury(Goner, ...GonerOption) Cemetery
,BuryOnce(goner Goner, options ...GonerOption) Cemetery
ReplaceBury(goner Goner, options ...GonerOption) error
-
重构了gone.Preparer
Preparer.Run
和Preparer.Serve
方法,支持传入函数作为参数在框架启动后执行,可以传0个或者多个,函数支持依赖注入;Preparer.BeforeStart
,Preparer.AfterStart
,Preparer.BeforeStop
,Preparer.AfterStop
注册的hook函数,支持依赖注入;- 添加
Preparer.Test
方法,用于编写测试代码。
-
基于 gone.Preparer 重构了 TestKit的实现,可以使用下面三种方式之一编写测试代码:
-
gone.Test
测试某种类型的Goner:gone.Test(func(line *Line) {assert.Equal(t, line.A.Y, 200)}, Priest)
-
gone.TestAt
,测试某个具名的Goner:gone.TestAt(pointNameA, func(point *Point) {assert.Equal(t, point.X, 0)assert.Equal(t, point.Y, 200)}, config.Priest, Priest)
-
gone.Prepare().Test
,Prepare上的Test方法,支持传入一个函数作为参数,函数的参数将会被自动注入。gone.Prepare(Priest).Test(func(line *Line, //注入gone框架中注册的类型in struct { //注入匿名结构体point *Point `gone:"example-test-point-a"`},) {assert.Equal(t, line.A.Y, 200)assert.Equal(t, in.point.Y, 200)})
-
内置Goners
-
重构
goner/gin
的HTTP请求参数注入机制。- 使用
Cemetery.InjectFuncParameters
方法,对处理请求时的依赖注入机制进行重构。 - 在v0.x的版本中,处理HTTP请求注入的方式时,每次请求时都会创建一个函数来处理注入;在v1.x的版本中,会在程序启动流程中一次性构建处理函数,每次处理HTTP请求时的性能损耗和gin的性能差异基本一致。
- HTTP请求参数的依赖注入,由于使用InjectFuncParameters重构,得到了增强:可以支持多个入参,入参可以是Gone框架中注册的接口或者结构体指针,也可以为被
gone
标记了属性的结构体,一般使用匿名结构体。
- 使用
-
重构
goner/config
,优化代码实现,将接口Configure
从goner/config
包中提到gone
包中。gone.Configure
接口用于从抽象的设备中读取配置项,支持实现使用其他方式读取配置,如从文件、数据库等。- 从
.properties
文件从读取配置,作为默认的配置读取方式,依赖保留在goner/config
包中。
-
新增加
goner/viper
,实现了gone.Configure
接口,支持从多种配置文件读取配置。 -
新增加
goner/zap
,集成了go.uber.org/zap
,用于日志输出。- 日志接口
Logger
从logrus.Logger
包移到gone
包中。 - 使用日志,只需要注入
gone.Logger
即可;无需关注底层使用的何种日志框架。
- 日志接口
覆盖测试
对gone的代码编写了大量的单元测试代码,覆盖率达到90%。
后续计划
- 提供更多的开箱可用的Goners,接入更多的优秀的Web中间件。
- 编写一个完善的参考案例