允许您高效开发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