go - 将全局引用传递给 beego Controller

标签 go beego

我正在尝试通过如下所示的路由器将在 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/

相关文章:

postgresql - Go:模板中来自 PostgreSQL 的变量不是输出值(Echo 框架)

sockets - 如何在 Go 中停止监听服务器

go - 如何检索选中的值

caching - 如何使用golang(beego)在redis中放置没有过期的缓存

go - 有没有办法在微服务前面实现 SSO?

rest - 使用 golang 通过 rest 端点将文件从客户端复制到服务器

html - 使用 Angular 的动态 UI

go - 将 map[string]SpecificType 与 map[string]SomeInterface 方法一起使用

mysql - 使用beego登录网站

json - 如何使用 Beego 验证 POST 请求中的 JSON 消息