2012-05-14 17 views
7

के लिए एक ही उदाहरण वापस नहीं हाल ही में, मैं Ninject 2 से Ninject 3.Ninject 3 InRequestScope एक ही अनुरोध

करने के लिए अपने MVC3 परियोजनाओं में से एक के लिए उन्नत लगाने के लिए क्यों InRequestScope अब उपलब्ध नहीं था की कोशिश कर कुछ मिनटों के बाद, मैंने पाया कि यह अब Ninject.Web.Common का विस्तार है।

अब, जब मैं एप्लिकेशन को चलाने का प्रयास करता हूं, तो निनजेक्ट काम करता है जैसे कि सभी प्रकार के दायरे से बंधे हैं InRequest InTransientScope होगा; हर बार एक नया उदाहरण बनाया गया था।

मेरी कक्षा कि NinjectModule से विरासत में, मैं उस तरह एक साधारण बाँध है:

Bind<ViewModel.Activity>().ToSelf().InRequestScope(); 

मेरी नियंत्रक में, मैं प्रकार ViewModel.Activity Ninject विशेषता के साथ चिह्नित के 2 गुण होते हैं।

[Inject] 
    public ViewModel.Activity Activity { get; set; } 

    [Inject] 
    public ViewModel.Activity Activity1 { get; set; } 

अगर मैं दोनों दो संपत्तियों की हैशकोड का मूल्य डिबग मोड में देखा, वहाँ सब मान अलग है लेकिन HttpContext समान होते हैं; मैं एक ही अनुरोध में हूं।

निनजेक्ट 3 के नए संस्करण के साथ नए Ninject.Web.Common.InRequestScope का सही तरीके से उपयोग करने के तरीके के बारे में मुझे क्या याद आया?

बहुत बहुत धन्यवाद।

+0

आप अपने कोड में निनजेक्ट को कैसे लगा रहे हैं? क्या आप Ninject.MVC3 को nuget से उपयोग कर रहे हैं, और फिर NinjectWebCommon.cs फ़ाइल को संपादित कर रहे हैं? या आप एक कस्टम नियंत्रक कारखाना कर रहे हैं? –

+0

एक कस्टम फैक्टरी – Samuel

+0

@MystereMan आपको बहुत बहुत धन्यवाद। यह वही है जो मैं चाहता हूं। मैंने निनजेक्ट एमवीसी 3 को खोजने के लिए NuGet का उपयोग किया और केवल मेरी निर्भरताओं के बंधन के लिए NinjectWebCommon में जो कहा था उसे जोड़ें और यह काम करता है। मुझे लगता है कि यह काम इन पंक्तियों के कारण क्यों है: DynamicModuleUtility.RegisterModule (typeof (OnePerRequestHttpModule)); और DynamicModuleUtility.RegisterModule (टाइपऑफ (NinjectHttpModule)); OnePerRequestHttpModule प्रत्येक अनुरोध के बाद काम की सभी इकाइयों को भी immeditaly का निपटान करेगा। आपका बहुत बहुत धन्यवाद! – Samuel

उत्तर

9

एक जवाब के रूप जोड़ा गया तो यह बाहर

बंद किया जा सकता एक कस्टम कारखाने का प्रयोग न करें। बस Ninject.MVC3 स्थापित करें और अपनी बाइंडिंग को NinjectWebCommon.cs फ़ाइल पर कॉपी करें, फिर अपने सभी पुराने कोड को हटा दें।

+0

उत्तर की शुरुआत में यह टिप्पणी क्या जोड़ा गया है? – Samuel

+0

@ सैमुएल - मैंने मूल रूप से इसे एक टिप्पणी के रूप में पोस्ट किया था, लेकिन आपने मुझे इसे उत्तर के रूप में पोस्ट करने के लिए कहा ताकि इसे उत्तर के रूप में चिह्नित किया जा सके। तो मैंने किया, और आप वास्तव में इसे जवाब के रूप में चिह्नित किया था। फिर, किसी कारण से, आपने अचानक जवाब के रूप में इसे चिह्नित करने का निर्णय लिया। –

+0

क्षमा करें, मेरी गलती। – Samuel

7

Ninject.Web.Common स्टैंडअलोन का उपयोग नहीं किया जा सकता है। आपको कुछ अतिरिक्त वेब या डब्ल्यूसीएफ एक्सटेंशन का उपयोग करना होगा या इनरक्वैस्टस्कोप को स्वयं लागू करना होगा।

+0

धन्यवाद आपके समय के लिए रेमो। क्या आपके पास इसे कार्यान्वित करने के कोड का नमूना है। मेरे मॉड्यूल में, मैं उस प्रकार के लिए बाइंड सिंटैक्स का उपयोग करता हूं जिसे मैं इंजेक्शन देना चाहता हूं और ninject.web.common का उपयोग करने की सहायता से, मैं बाइंड निर्देश के अंत में कॉल इनवेक्वेस्टस्कोप के अंत में कॉल करता हूं। यह स्पष्ट करने के लिए पर्याप्त नहीं है कि मैं किस दायरे को चाहता हूं? – Samuel

+1

नहीं, यह पर्याप्त नहीं है, क्योंकि InRequestScope का मतलब InWCFRequestScope या InHttpRequestScope और भविष्य में अन्य स्कोपों ​​में भी हो सकता है। Web.Common विभिन्न अनुरोध प्रकारों के बारे में कुछ भी नहीं जानता है। मैं वेब एक्सटेंशन में से किसी एक का उपयोग करने की दृढ़ता से सलाह देता हूं। अपने कारखानों को लागू करने का कोई कारण नहीं है और मैं उन पर कोई समर्थन नहीं देता हूं। यदि आप वास्तव में अपने कारखाने का उपयोग करना चाहते हैं तो एक्सटेंशन को देखें और वहां से सभी तर्कों की प्रतिलिपि बनाएँ। –

+0

हाय रेमो, मेरी मदद करने में धन्यवाद। मैंने एक्सटेंशन और Google 'InHttpRequestScope' में खोज की लेकिन मुझे कोई जानकारी नहीं मिली जो मुझे InHttpRequestScope को लागू करने में मदद करती है। मुझे इस विधि, कक्षा में कौन सा एक्सटेंशन मिल सकता है? – Samuel