我正在尝试通过如下所示的路由器将在 main.go 中初始化的记录器引用传递给 Controller 层
主.go
logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
sugar := logger.Sugar()
routers.Init(sugar)
routers.go
func Init(l *zap.SugaredLogger) {
nsMgt := beego.NewNamespace("/api",
beego.NSNamespace("/account",
beego.NSInclude(
&controllers.AccountController{
Logger: l,
},
),
),
)
)
controller.go
type AccountController struct {
beego.Controller
Logger *zap.SugaredLogger
}
// @Title Get account details.
// @Summary Get account details
// @Param filterKey query string true "possible values 'id' or 'username'"
// @Param filterValue query string true "value of the filter key"
// @Success 200 {object} models.User
// @router / [get]
func (o *AccountController) Get() {
o.Logger.Info("this is cool")
}
它在 Controller 函数中抛出一个空指针错误。有没有办法将全局记录器变量传递给 Controller 层?。在主函数中初始化记录器很重要,因为它需要延迟关闭。
最佳答案
Beego 使用反射为每个请求创建一个 Controller 实例,它不会使用您传入的实际实例,也不会将参数传递给新实例。您可以在您的 Controller 上定义“Prepare”方法,该方法将在运行时由 Beego 在调用匹配的 Controller 方法之前调用,在那里您可以通过调用工厂方法或某种 IoC 容器来初始化所需的结构字段(例如服务层)(不确定这是否是 Go 的最佳实践)
我也在寻找在初始化结构时传递依赖项的选项,但目前不可能。
查看请求处理逻辑:https://beego.me/docs/mvc/
准备方法记录在这里: https://beego.me/docs/mvc/controller/controller.md
关于go - 将全局引用传递给 beego Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45434675/