# v1.x版本 正式发布

# 优化和新特性

# gone 核心功能增强

  1. 重构了函数参数依赖注入 在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个参数成功构造后调用;
    • 出参说明
      • args,fn参数的reflect.Value数组
      • err,函数构造返回的错误
    • 功能说明: 根据fn函数的定义和Gone框架中注册的Goners,自动构造fn的参数数组args。然后可以使用func (v Value) Call(in []Value) []Value对函数进行调用。
  2. 引入了gone.GonerOption接口,用于给Bury提供选项。

    • gone.GonerId,在Bury时给Goner提供GonerId
    • gone.Order,在Bury时给Goner提供一个序号;可以用于明确定义Goners的加载顺序和hook函数的执行顺序。
    • gone.IsDefault,在Bury时给Goner提供默认的接口类型,后续我们将另外些一篇博客介绍该特性。
  3. 调整了CemeteryBury*方法支持gone.GonerOption接口,包括:

    • Bury(Goner, ...GonerOption) Cemetery
    • BuryOnce(goner Goner, options ...GonerOption) Cemetery
    • ReplaceBury(goner Goner, options ...GonerOption) error
  4. 重构了gone.Preparer

    • Preparer.RunPreparer.Serve方法,支持传入函数作为参数在框架启动后执行,可以传0个或者多个,函数支持依赖注入;
    • Preparer.BeforeStart, Preparer.AfterStart, Preparer.BeforeStop, Preparer.AfterStop 注册的hook函数,支持依赖注入;
    • 添加Preparer.Test方法,用于编写测试代码。
  5. 基于 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

  1. 重构goner/gin的HTTP请求参数注入机制。

    • 使用Cemetery.InjectFuncParameters方法,对处理请求时的依赖注入机制进行重构。
    • 在v0.x的版本中,处理HTTP请求注入的方式时,每次请求时都会创建一个函数来处理注入;在v1.x的版本中,会在程序启动流程中一次性构建处理函数,每次处理HTTP请求时的性能损耗和gin的性能差异基本一致。
    • HTTP请求参数的依赖注入,由于使用InjectFuncParameters重构,得到了增强:可以支持多个入参,入参可以是Gone框架中注册的接口或者结构体指针,也可以为被gone标记了属性的结构体,一般使用匿名结构体。
  2. 重构 goner/config,优化代码实现,将接口Configuregoner/config包中提到gone包中。

    • gone.Configure接口用于从抽象的设备中读取配置项,支持实现使用其他方式读取配置,如从文件、数据库等。
    • .properties文件从读取配置,作为默认的配置读取方式,依赖保留在goner/config包中。
  3. 新增加goner/viper,实现了gone.Configure接口,支持从多种配置文件读取配置。

  4. 新增加goner/zap,集成了go.uber.org/zap,用于日志输出。

    • 日志接口Loggerlogrus.Logger包移到gone包中。
    • 使用日志,只需要注入gone.Logger即可;无需关注底层使用的何种日志框架。

# 覆盖测试

对gone的代码编写了大量的单元测试代码,覆盖率达到90%。

test (opens new window)

# 后续计划

  1. 提供更多的开箱可用的Goners,接入更多的优秀的Web中间件。
  2. 编写一个完善的参考案例