看了一下iris源码,都有相应的接口,要实现并不难
Application结构体的Router和ContextPool都是可见的,根据情况自己实现相应的接口,重新设置一下Application的实例就可以
以下是Application的源码
// New creates and returns a fresh empty iris *Application instance.
func New() *Application {
config := DefaultConfiguration()
app := &Application{
config: &config,
logger: golog.Default,
APIBuilder: router.NewAPIBuilder(),
Router: router.NewRouter(),
}
app.ContextPool = context.New(func() context.Context {
return context.NewContext(app)
})
return app
}
思路:
返回app后,重新修改app.ContextPool = context.New(func() context.Context {
c := context.NewContext(app) //原来的Context实例
mc := &MyContext{c} //MyContext重新实现context.Context接口
return mc
})
//重新实现Context接口
type MyContext struct {
base_context context.Context //保存原来的Context实例
}
func (mc *MyContext) Do(Handlers) { //其他方法类似,你想在哪个方法加拦截就加拦截,不需要拦截器就直接调用原来的Context实例的方法
doYourFun() //加入你的拦截
mc.base_context(Handlers) //调用原来的Context实例的方法
}
//context.Context 的接口方法请参照源码
https://github.com/kataras/iris/blob/master/context/context.go