2012-06-26 8 views
6

समस्या तब शुरू हुई जब मैं एक MVC 4 आर सी वेब एपीआई परियोजना के साथ Ninject 3 उपयोग करने के लिए नीचे दिए गए समाधान का उपयोग करने की कोशिश कर रहा था:त्रुटि जब एक IActivationBlock निपटाने और आयात IKernel

http://www.peterprovost.org/blog/2012/06/19/adding-ninject-to-web-api/

यह समाधान IActivationBlock (का उपयोग करता है कॉल के दायरे को लागू करने के लिए IKernel से BeginBlock विधि के साथ बनाया गया)। एक नियमित रूप से Ninject परियोजना के साथ, ठीक से काम करने लगता है, लेकिन जब परियोजना विस्तार Ninject.Extensions.Interception.DynamicProxy का उपयोग करता है, निम्नलिखित अपवाद तब होता है जब सक्रियण ब्लॉक के निपटान विधि कहा जाता है:

लोड करने में त्रुटि Ninject घटक IAdviceRegistry

कर्नेल के घटक कंटेनर में ऐसा कोई घटक पंजीकृत नहीं हुआ है।

और, अगली बार जब एक नया ActivationBlock बनाई गई है और हल विधि कहा जाता है में, निम्नलिखित अपवाद तब होता है:

त्रुटि Ninject घटक ICache लोड हो रहा है

ऐसा कोई घटक है कर्नेल के घटक कंटेनर में पंजीकृत है।

ऐसा लगता है कि समस्या सीधे एमवीसी अपडेट से संबंधित नहीं है, लेकिन डायनेमिक प्रॉक्सी और आईएक्टिवेशनब्लॉक के बीच कुछ असंगतता है।

संपादित करें:

समस्या का स्रोत है जब प्रकारों में से एक निर्माता पर IKernel आवश्यकता है, और यह सीधे DynamicProxy से संबंधित नहीं है, लेकिन आप इस विधानसभा का संदर्भ जब पहली अपवाद केवल तब होता है।

तो, दूसरी त्रुटि (आईसीएच से संबंधित) हमेशा तब होती है जब आपके प्रकार को IKernel की आवश्यकता होती है।

+0

मैं इसे भी देख रहा हूं –

+0

कोई भी कभी भी कामकाज का पता लगाता है? – dtabuenc

उत्तर

0

अपने अच्छे विश्लेषण को गर्म करने के लिए: आप एक सक्रियणब्लॉक के अंदर एक वर्ग का उदाहरण बनाते हैं जिसमें सीधे IKernel पर निर्भरता है।

यह एक तार्किक दोष है, क्योंकि सक्रियणब्लॉक का विचार ब्लॉक के निपटारे के बाद कर्नेल के "राज्य को पुनर्स्थापित करना" है और एक उदाहरण जिसके पास कर्नेल तक पहुंच है और बिना किसी बाध्यकारी को बदल सकता है। (हां, उदाहरण एक आईडीस्पोज़ेबल हो सकता है जो अपने स्वयं के बाद साफ हो जाता है, फिर कोई तार्किक दोष नहीं है - केवल असामान्य उपयोग केस)।

मेरा प्रयोग यह है कि इन उपयोगों का विशाल बहुमत IKernel.Get < ...> (...) और दोस्तों को कॉल करना है। जाहिर है यह एक सक्रियणब्लॉक के अंदर मान्य है: आप केवल अपनी आवश्यकता से अधिक अनुरोध कर रहे हैं: IescelRoot के बजाय IKernel (उदा। आपको IKernel की IBindingRoot की आवश्यकता नहीं है)। अपनी कक्षा में प्रकार बदलें और आप ठीक हो जाएंगे।

पीएस अपवाद के स्रोत के लिए आपके विश्लेषण के लिए धन्यवाद। इससे मुझे अपनी समस्या से मदद मिली।

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