2014-10-06 6 views
12

पर तर्क कैसे पास करूं? मैं वैश्विक ऑब्जेक्ट होने के बजाय, अपने हैंडलर के साथ अपना डेटाबेस ऑब्जेक्ट पास करने का प्रयास कर रहा हूं। लेकिन मुझे नहीं पता कि यह संभव है, मैं गोरिल्ला मक्स पैकेज का उपयोग कर रहा हूं, और मैं देख सकता हूं कि यह एक दूसरे पैरा के रूप में बंद हो जाता है।मैं अपने हैंडलर

// 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) 
} 

जो तब पैराम्स को परिभाषित करता है जो मैं उपयोग कर सकता हूं, आदर्श रूप में मैं इस तरह का तीसरा param चाहता हूं।

// 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"]) 
} 

क्या कोई कामकाज है? या मुझे वैश्विक डीबी ऑब्जेक्ट चाहिए? मैं जाने के लिए नया हूं, इसलिए विस्तार से एक संभावित उत्तर की व्याख्या करें।

+2

http://stackoverflow.com/a/26106655/6309 आप कुछ विचार भी दे सकते हैं। – VonC

+0

@ वॉनसी मैंने वास्तव में http://simonsdotnet.wordpress.com/2014/09/06/extending-gos-http-handlers/ की कोशिश की लेकिन पाया कि यह गोरिल्ला के साथ काम नहीं करता है, क्योंकि http पैकेज सिर्फ ServeHTTP चाहता है, लेकिन गोरिल्ला विशिष्ट पैरा के साथ एक func चाहता है। मैं गलत हो सकता है। – MartinElvar

उत्तर

22

जाने के लिए आपका स्वागत है।

वैश्विक चर और विशेष रूप से डेटाबेस ऑब्जेक्ट्स के लिए स्वीकार्य है।

हालांकि, अगर आप ऐसा नहीं करना चाहते हैं तो काम करने के कुछ तरीके हैं, उदाहरण के लिए आप एक संरचना बना सकते हैं और अपने 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। विचार यह था कि मैं इसे करने का एक और डीआई तरीका चाहता था, शायद मैं इसे खत्म कर रहा हूं। आप कौन सा समाधान कहेंगे सबसे साफ है? डेटाबेस कनेक्शन के लिए – MartinElvar

+0

@MartinElvar, मैं कहूंगा कि एक वैश्विक चर ठीक है। यदि आप विशिष्ट चर चाहते हैं जो केवल फ़ंक्शंस समाधान के विशिष्ट सेट द्वारा उपयोग किए जा सकते हैं। – OneOfOne

+0

@MartinElvar यह भी ध्यान में रखता है कि अधिकांश डेटाबेस हैंडलर समरूपता के लिए सुरक्षित हैं, जबकि बाकी सब कुछ नहीं है, इसलिए यदि आप एक हैंडलर में एक चर सेट करते हैं और इसे दूसरे में प्राप्त करते हैं, तो आपको किसी प्रकार की लॉकिंग का उपयोग करना होगा। – OneOfOne

संबंधित मुद्दे