2014-10-06 98 views
12

我想將我的數據庫對象傳遞給我的處理程序,而不是具有全局對象。但我不知道這是否可行,我使用的是Gorilla Mux軟件包,而且我可以看到它需要一個閉包作爲第二個參數。如何將參數傳遞給我的處理程序

// https://github.com/gorilla/mux/blob/master/mux.go#L174 
// HandleFunc registers a new route with a matcher for the URL path. 
// See Route.Path() and Route.HandlerFunc(). 
func (r *Router) HandleFunc(path string, f func(http.ResponseWriter, 
    *http.Request)) *Route { 
    return r.NewRoute().Path(path).HandlerFunc(f) 
} 

然後,它定義了我可以使用的參數,理想情況下,我想有這樣的第三個參數。

// In my main 
router.HandleFunc("https://stackoverflow.com/users/{id}", showUserHandler).Methods("GET") 

func showUserHandler(w http.ResponseWriter, r *http.Request, db *gorm.DB) { 
    fmt.Fprintf(w, "We should fetch the user with id %s", vars["id"]) 
} 

是否有解決方法?或者我需要一個全局數據庫對象?我是Go的新手,所以請詳細解釋一下可能的答案。

+2

http://stackoverflow.com/a/26106655/6309可以給你一些想法了。 – VonC 2014-10-06 08:12:51

+0

@VonC我實際上嘗試http://simonsdotnet.wordpress.com/2014/09/06/extending-gos-http-handlers/,但發現它沒有與大猩猩一起工作,因爲http包只是想要ServeHTTP,但大猩猩想要一個具有特定參數的函數。我可能是錯的。 – MartinElvar 2014-10-06 08:18:28

回答

22

歡迎使用Go。

具有全局變量和專門的數據庫對象是可以接受的。

但是,有幾種方法可以解決這個問題,如果您不想這樣做,例如您可以創建一個結構並在其上定義您的showHandler

type Users struct { 
    db *gorm.DB 
} 

func (users *Users) showHandler(w http.ResponseWriter, r *http.Request) { 
    //now you can use users.db 
} 
func (users *Users) addHandler(w http.ResponseWriter, r *http.Request) { 
    //now you can use users.db 
} 

// setup 
users := &Users{db: createDB()} 
router.HandleFunc("https://stackoverflow.com/users/{id}", users.showHandler).Methods("GET") 
router.HandleFunc("https://stackoverflow.com/users/new", users.addHandler) 
//etc 

另一種方法是創建一個包裝函數:

db := createDB() 
router.HandleFunc("https://stackoverflow.com/users/{id}", func(w http.ResponseWriter, r *http.Request) { 
    showUserHandler(w, r, db) 
}).Method("GET") 
+0

謝謝OneOfOne。這個想法是,我想要更多的DI方法來做到這一點,也許我正在推翻它。你會說哪種解決方案最乾淨? – MartinElvar 2014-10-06 08:13:04

+0

@MartinElvar用於數據庫連接,我想說一個全局變量很好。如果你想要特定的變量只能被一組特定的函數使用,那麼就是struct解決方案。 – OneOfOne 2014-10-06 08:15:39

+0

@MartinElvar還記得,雖然大多數數據庫處理程序對於併發是安全的,但其他一切都不是,所以如果你在一個處理程序中設置一個變量並將它放在另一個處理程序中,你將不得不使用某種鎖定。 – OneOfOne 2014-10-06 08:16:46

相關問題