Gone框架介绍32 (gin框架)

Gone框架介绍32 gone是可以高效开发Web服务的Golang依赖注入框架 github地址:https://github.com/gone-io/gone 文档地址:https://goner.fun/

允许您高效开发Web 服务的Golang 依赖注入框架已经消失。

github地址:https://github.com/gone-io/gone

文档地址:https://goner.fun/zh/

函数参数的依赖注入

函数参数依赖注入是v1版本正式发布的新功能。此功能由Cemetery 接口的InjectFuncParameters 方法提供。

虽然一般不建议在业务文档中使用此功能,但如果您想扩展Gone 框架的功能,则可以使用它。

InjectFuncParameters 方法说明

方法定义

注入函数参数(

任何状况之下,

jectBefore func(pt Reflect.Type, i int) 任意,

jectAfter func(pt Reflect.Type, i int),

) (args []reflect.Value, err 错误)

输入指令:

fn,需要注入的函数。函数可以有多个输入参数。输入参数可以是在Gone 框架中注册的接口或结构体指针,或者通常是由Gone 标记有属性的结构体。如果使用injectBefore,则会在构造第i个参数之前调用钩子函数。如果injectBefore(x, i)的返回值不为nil,则InjectFuncParameters不会构造fn函数的第i个参数。一个钩子函数,直接使用值reflect.Value作为args数组的第i个值,并在成功构造第i个参数后调用。

args,reflect.Value fn 参数数组err,函数构造函数返回的错误函数说明:

fn参数数组args是根据fn函数定义和Gone框架中注册的Goners自动构造的。然后,您可以使用func (v Value) Call(in []Value) []Value 调用该函数。

Gone 源代码中使用例子

WrapNormalFnToProcess

func WrapNormalFnToProcess(fn any) 进程{

//Process 函数只有一个Cemetery 参数

返回func(墓地墓地) 错误{

//根据函数的定义使用cemetery.InjectFuncParameters 构建函数的参数数组

参数,错误:=cemetery.InjectFuncParameters(fn, nil, nil)

如果出现错误!=nil {

返回错误

}

//使用reflect.ValueOf(fn).Call(args)调用函数

结果:=Reflect.ValueOf(fn).Call(args)

对于_,结果:=结果范围{

如果错误,ok :=result.Interface().(error);

返回错误

}

}

返回零

}

}

上面的代码是基于Gone的help.go,其作用是将函数转换为进程。如果您查看prepare.go 的代码,您会看到如下内容:

//.

func (p *Preparer) BeforeStart(fn any) *Preparer {

p.heaven.BeforeStart(WrapNormalFnToProcess(fn))

返回p

}

func (p *Preparer) AfterStart(fn any) *Preparer {

p.heaven.AfterStart(WrapNormalFnToProcess(fn))

返回p

}

func (p *Preparer) BeforeStop(fn any) *Preparer {

p.heaven.BeforeStop(WrapNormalFnToProcess(fn))

返回p

}

func (p *Preparer) AfterStop(fn any) *Preparer {

p.heaven.AfterStop(WrapNormalFnToProcess(fn))

返回p

}

func (p *Preparer) SetAfterStopSignalWaitSecond(sec int) {

p.heaven.SetAfterStopSignalWaitSecond(秒)

}

func (p *Preparer) Run(fns .any) {

p.SetAfterStopSignalWaitSecond(0)

对于_,fn :=范围fns {

p.AfterStart(fn)

}

天堂。

安装()。

开始()。

停止()

}

//.

可以看到,通过Preparer的BeforeStart、AfterStart、BeforeStop、AfterStop方法,可以将任何函数转换为Process,并注册到Heaven。原则上,您可以通过WrapNormalFnToProcess 将任何函数转换为Process 函数。为什么支持Preparer.Run方法?带有任意参数的函数也可以通过WrapNormalFnToProcess函数来实现。

buildProxyFn

buildProxyFn方法的代码截取自goner/gin/proxy.go,是实现HTTP请求参数注入的关键函数。它的功能是将带有任意参数的函数转换为gin.HandlerFunc 并将其注册到gin 中。引擎。使用InjectFuncParameters 的目的是收集依赖项,在函数构造之前注入Goners,并将依赖项延迟注入到HTTP 请求参数中,直到函数执行阶段。

//.

func (p *proxy) buildProxyFn(x HandlerFunc, funcName 字符串, 最后一个bool) gin.HandlerFunc {

m :=make(map[int]*bindStructFuncAndType)

参数,错误:=p.cemetery.InjectFuncParameters(

X,

//传递钩子injectBefore完成特殊参数的过滤

func(pt Reflect.Type, i int) 任意{

//.

},

//通过hook InjectAfter收集HTTP请求参数依赖

func(pt Reflect.Type, i int) {

//.

},

如果出现错误!=nil {

p.Panicf(\’为\\033[31m%s\\033[0m error:\\n\\n%s\’\’, funcName, err) 构建代理函数

}

fv :=Reflect.ValueOf(x)

返回func(context *gin.Context) {

//.

//将依赖项延迟注入到HTTP 请求参数中

//.

//调用函数x

值:=fv.Call(参数)

//.

}

}

//.

以上关于#Gone Framework简介32的相关内容摘自网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91508.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月22日 下午1:00
下一篇 2024年6月22日 下午1:18

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注