【发布时间】:2015-08-23 09:22:15
【问题描述】:
我有一个用于应用程序上下文的Context 结构。 ConfigureRouter 函数接收上下文作为参数并设置全局变量c 以便同一文件中的中间件可以使用它。
var c *core.Context
func ConfigureRouter(ctx *core.Context, router *httprouter.Router) {
c = ctx //make context available in all middleware
router.POST("/v1/tokens/create", token.Create) //using httprouter
}
上面列出的一个路由调用token.Create(来自作为子目录的令牌包),但它也需要上下文。
//token/token.go
func Create(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
//Help! I need the context to do things
}
如何将上下文传递给令牌包?
【问题讨论】:
-
谢谢,有什么建议吗?
-
我应该明确指出,这个问题中的
context不是请求上下文,而是存储数据库和缓存连接等的“应用程序上下文”。我不认为传递它以使其在项目的其他地方可用的问题。这是一个老问题,所以我已经删除了全局变量c,因为我问了这个问题。 -
我可能误解了不可变上下文。我以为你在使用 net/context,但我看到你的变量被称为 core.Context...所以我真的不知道它是做什么的。
-
无论如何,如果可以避免的话,你不应该使用全局变量。这是不好的做法......对于像你这样的单例进程来说最重要的地方可能是编写单元测试。
-
是的,关于全局变量,我和你在同一个阵营——这是一个早期的设置,现在没有使用。关于上下文,我使用 Gorilla 作为请求上下文,但问题中的 Context 存储用户可以设置的配置文件中的值。因此,其他文件需要访问这些设置,所以我有两个上下文 - 可能是非正统的,但它可以完成工作!
标签: go