go-zero
go-zero copied to clipboard
About middleware dependency
生成的代码中,logic包依赖svc包,svc包又依赖middleware包,那么由于循环依赖的问题,middleware中就根本不可能调用logic包中的代码。
我觉得不应该把middleware的实例放在ServiceContext中,而是应该让middleware依赖svc包,把ServiceContext传入middleware来初始化, handler/routes.go中应该生成这样的代码rest.Middleware{middleware.NewFooMiddleware(serverCtx).Handle},而不是现在这样rest.Middleware{serverCtx.FooMiddleware}
再补充个理由: 既然handler是依赖svc包的,middleware和handler有一样的行为,也应该是让middleware依赖svc,而不是svc包依赖middleware
实际上由于 redis,config 等也都挂载在 svc 中,所以按官方最佳实践,连这部分也无法直接使用。
权宜之计: main.go或者 svc 中,在注入middleware的时候把依赖项一个个独立手动注入(过程相当于重新独立初始化 svc 中做过的事情)。
赞成楼主说的:rest.Middleware{middleware.NewXXMiddleware(serverCtx).Handle}