2015-10-20 63 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() 

當然,你可以外部化的第一行到工廠,但這並不會真正消除代碼或使其更具可讀性。

相關問題