2015-10-20 65 views
0

我是GOLANG的新手 - 我想降低GO API中处理程序的复杂性。我来自Node.js背景!创建一个函数,它返回与Golang和MGO的mongo集合

目前的路由处理程序是这样的:

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() 

并让它创建会话等,这可能吗?

回答

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) 
} 
+0

这不是最好的主意。会话大致转换为连接。所以通过它可能会导致人为瓶颈。 –

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() 

当然,你可以外部化的第一行到工厂,但这并不会真正消除代码或使其更具可读性。

相关问题