我是GOLANG的新手 - 我想降低GO API中处理程序的复杂性。我来自Node.js背景!
目前,路由处理程序如下所示:
func getCards(c web.C, w http.ResponseWriter, r *http.Request) {
session := *MongoConnection().CreateSession()
defer session.Close()
collection := session.DB(db).C(cardsCollection)
result := []Card{}
err := collection.Find(bson.M{}).All(&result)
if err != nil {
panic(err)
}
w.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(w)
encoder.Encode(result)
}
我想做的是返回一个集合供使用,而不必做这个部分:
session := *MongoConnection().CreateSession()
defer session.Close()
collection := session.DB(db).C(cardsCollection)
相反,我想做像
这样的事情collection := Card.Collection()
让它创建会话等,这可能吗?
答案 0 :(得分:1)
为什么不在main
函数中创建会话,并将其传递给需要它的包。这显然缺少大量的东西,但总的想法是
package main
//imports
func main() {
session := *MongoConnection().CreateSession()
defer session.Close()
Card.SetSession(session)
//other stuff
log.Fatal(http.ListenAndServe(":80", nil))
}
然后在卡
package Card
var session *mgo.Session
func SetSession(s *mgo.Session) {
session = s
}
func (c *Card) Collection() *mgo.Collection {
return session.DB(db).C(cardsCollection)
}
答案 1 :(得分:0)
您所描述的是工厂模式。但有一些警告要处理。 延迟是调用范围的本地。因此,如果您将延迟放入工厂方法,会话将在返回时基本关闭。
简单地定义一个会话并在整个地方重复使用它几乎与使用单个SQL数据库连接而不是池一样 - 它可扩展性很差。
这是我倾向于做的事情:我将我的集合作为全局集合,并在我的方法开头执行以下操作
// Create a func-local session
myCollection := globalCollection.With( globalCollection.Database.Session.Copy() )
// Close it on exiting the scope
defer myCollection.Database.Session.Close()
当然,您可以将第一行外部化为工厂,但这不会真正整理代码或使其更具可读性。