2012-02-23 7 views
11

के साथ निनजेक्ट का उपयोग करना मैं अटक गया हूं। मैं wcf web api p6 Ninject working with WCF Web API Preview 5 के लिए यहां उल्लिखित विधि का उपयोग कर रहा था, हालांकि बीटा में एमवीसी कार्यान्वयन के साथ चीजें काफी अलग हैं। यहां एक अच्छा आलेख है http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver जो आपके स्वयं के कस्टम निर्भरता रिज़ॉल्यूवर के निर्माण के बारे में बात करता है, हालांकि मैं अपने एमवीसी व्यू कंट्रोलर के लिए उपयोग कर रहा हूं उसी कार्यान्वयन का उपयोग करना चाहता हूं ... उदा। Ninject। मैंने लेख में आईओसी यूनिटी उदाहरण के आधार पर कुछ चीजों की भी कोशिश की है, लेकिन अभी तक कुछ भी नहीं निकला है। सही दिशा में मुझे इंगित करने में कोई भी मदद की सराहना की जाएगी। मैं अपने आप पर खुदाई रखने जा रहा हूं। अग्रिम में धन्यवाद!एएसपी.नेट वेब एपीआई बीटा एपीकंट्रोलर

यहां मैं कहां हूं। मैं कोड को बूटस्ट्रैप करने के लिए वेब एक्टिवेटर का उपयोग कर रहा था, लेकिन बाद में मैंने इसे समीकरण से एक और चीज़ लेने के लिए एप्लिकेशन_स्टार्ट() पर छोड़ दिया है।

protected void Application_Start() 
    { 
     var kernel = new StandardKernel(new MyNinjectModule()); 
     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
    } 

और निम्न त्रुटि मिल रही है:
प्रकार Ninject.Web.Mvc.NinjectDependencyResolver Microsoft.Practices.ServiceLocation.IServiceLocator लागू करने के लिए प्रकट नहीं होता।
पैरामीटर नाम: commonServiceLocator

मिले समाधान
शायद नहीं है/एक और अधिक सुरुचिपूर्ण तरीका होगा, लेकिन यह अब मेरे लिए काम कर रहा है। मैं यहां भी अपना कस्टम संदेश हैंडलर भी जोड़ रहा हूं।

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")] 
namespace MyApp.AppStart 
{ 
    public class ApiBootstrapper 
    { 
     public static void Start() 
     { 
      var kernel = new StandardKernel(new MyNinjectModule()); 
      var resolver = new NinjectDependencyResolver(kernel); 
      GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices); 
      GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler()); 
     } 
    } 
} 
+0

यह एक काफी अच्छा समाधान है: http://haacked.com/archive/2012/03/11/itrsquos- थोड़ी-चीजें-एएसपी-नेट-एमवीसी-4.aspx –

+0

यदि आप दोनों प्रकार के नियंत्रकों के लिए समान बाइंडिंग का उपयोग करना चाहते हैं तो नीचे @ रेमो ग्लोर का पैकेज भी देखें। आप इसे गीथब पर पा सकते हैं और इसे न्यूजेट से इंस्टॉल कर सकते हैं। –

उत्तर

3

मैं वेबएपीआई इस्तेमाल कभी नहीं किया लेकिन जब से IDependencyResolver का अर्थ MVC3 से एक के रूप में बिल्कुल वैसा ही है कि आप एक ही कार्यान्वयन उपयोग करने के लिए सक्षम होना चाहिए: https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/NinjectDependencyResolver.cs

अद्यतन: Ninject.Web .WebAPi एक्सटेंशन ApiControllers

+2

यह वास्तव में उन चीजों में से एक है जिसकी मैंने कोशिश की, दुर्भाग्य से कोई खुशी नहीं। उदाहरण के लिए ServiceResolver.SetResolver (नया NinjectDependencyResolver (कर्नेल)) निम्न त्रुटि उत्पन्न करता है: _Ninject.Web.Mvc.NinjectDependencyResolver माइक्रोसॉफ्ट को लागू करने के लिए प्रतीत नहीं होता है। व्यवहार .erviceLocation.IServiceLocator_ –

+0

समाधान अंततः ninjectdepencencyresolver क्लास का उपयोग करने के लिए था, मेरे पास अभी था setresolver पर एक वैकल्पिक विधि हस्ताक्षर का उपयोग करने के लिए। जवाब के लिए धन्यवाद! –

0

मूर्खतापूर्ण ध्वनि के लिए समर्थन जोड़ता है लेकिन क्या आपने यह सुनिश्चित किया है कि आपके पास CommonServiceLocator/CommonServiceLocator.NinjectAdapter nuget पैकेज या संबंधित असेंबली का संदर्भ है। आपका NinjectDependencyResolver IServiceLocator के संदर्भ को हल करने में सक्षम नहीं हो सकता है।

+0

मैंने दोनों पैकेज स्थापित किए, लेकिन अभी भी कोई भाग्य नहीं है। आप देख सकते हैं कि ninject.mvc packacke वर्तमान में वेबएक्टिवेटर का उपयोग कर कस्टम बूटस्ट्रैपर के माध्यम से स्वयं को कैसे तार देता है ... लेकिन यह एपिकंट्रोलर अनुरोध जीवन चक्र के बाहर होना चाहिए क्योंकि रिकॉस्ट वास्तव में सीधे नियंत्रक के पास नहीं जाता है ... यह आपके लिए बनाया गया है ढांचे के द्वारा। –

+0

समस्या यह थी कि मेरा कोड इस विधि हस्ताक्षर http://msdn.microsoft.com/en-us/library/hh835505(v=vs.108).aspx को हल कर रहा था जब मैंने सोचा कि यह इस http का उपयोग कर रहा था://msdn.microsoft.com/en-us/library/hh835218(v=vs.108).aspx। शुक्र है कि एक तीसरा विकल्प है जो प्रकार की समस्या के आसपास हो जाता है। जवाब हैमज़ के लिए धन्यवाद! –

1

मुझे उत्तर मिला और समाधान के साथ ऊपर मेरा प्रश्न अपडेट किया। Using the Web API Dependency Resolver आलेख में समाधान स्वयं कम या कम मौजूद था, मुझे केवल निंजा के लिए tweaking रखना पड़ा। दोनों उत्तरों ने मुझे इसे कम करने में मदद की ताकि @Remo और @James के लिए धन्यवाद।

+0

क्या आप बाध्यकारी और बाकी एडाप्टर कोड को शुरू करते समय कुछ कोड उदाहरण दे सकते हैं? –

+1

@ShawnMclean मुझे यकीन नहीं है कि मैं आपका अनुसरण कर रहा हूं। उपर्युक्त मेरे समाधान में, मैं वेबपै के साथ निन्जेक्ट निर्भरता रिज़ॉल्वर को पंजीकृत करने के लिए एक कस्टम क्लास पर वेबएक्टिवेटर nuget पैकेज का उपयोग कर रहा हूं (ninjectmodule से व्युत्पन्न एक अलग वर्ग में मेरी बाइंडिंग को परिभाषित करता हूं)। आप वही विधि कोड भी ले सकते हैं और इसे अपनी global.asax फ़ाइलों में डाल सकते हैं Application_Start() विधि, मैं बस इस बूटस्ट्रैपिंग दृष्टिकोण को पसंद करता हूं। फिलहाल एक प्रतिक्रिया भी है जो फिल हैक के समाधान का उल्लेख करती है, जो अनिवार्य रूप से आपको एमवीसी और वेब एपीआई दोनों के लिए समान बाइंडिंग का उपयोग करने की अनुमति देती है। हालांकि मैं समय के लिए अपनी विधि पसंद करते हैं। प्रतिक्रिया के लिए –

0

एक ही कोड एमवीसी और वेबएपी दोनों के लिए काम करेगा, हालांकि वेबएपीआई एमवीसी से प्रेरित था और एमवीसी असेंबली को वेबएपी (या vise versa) का उपयोग करने के लिए संदर्भित नहीं किया जाना चाहिए, एक उचित राशि है दो ढांचे के बीच कोड के दोहराव की। यदि आप एमवीसी का उपयोग करना चाहते हैं तो आप System.Web.Mvc से निर्भरताएं आ सकते हैं, यदि आप वेबएपी का उपयोग करना चाहते हैं तो आप System.Web.Http का उपयोग करेंगे। यदि आप दोनों का उपयोग करना चाहते हैं तो आपको अधिक स्पष्ट नामस्थान रिज़ॉल्यूशन का उपयोग करते समय, अपने कोड में अंतर करना होगा।

आपके मामले में आपकी समस्या यह है कि एमवीसी पहले आया और NinjectDependancyResolver वर्ग System.Web.Mvc.IDependencyResolver से विरासत में मिला। आप NinjectDependancyResolver क्लास का सटीक डुप्लिकेट बनाना चाहते हैं और इसके बजाय System.Web.Http.IDependencyResolver से इसके बजाय प्राप्त करना चाहते हैं। अपने आईओसी को स्थापित करने के लिए इस कक्षा का प्रयोग करें और आप जाने के लिए अच्छे होंगे।

+0

धन्यवाद! यह अनिवार्य रूप से मैंने आपके उत्तर में जो डुप्लिकेशन समस्या का वर्णन किया है, उसके कारण मैंने किया था। हालांकि, क्योंकि यह ओवरलोड setresolver http://msdn.microsoft.com/en-us/library/hh834083(v=vs.108).aspx पर मौजूद है क्योंकि मैं एक डुप्लिकेट निंजा निर्भरता रिज़ॉल्वर बनाने में सक्षम था जो सिस्टम को लागू करता है इंटरफ़ेस का .web.http संस्करण। मेरी इच्छा है कि वे इसे संभालने के लिए एक बेहतर तरीके से आए थे। मैं वास्तव में दोनों के लिए एक ही निर्भरता संकल्प का उपयोग करने में सक्षम होना चाहिए। –

0

मुझे एक अच्छा समाधान मिला here

यह बहुत आसान है, तो आप पहले से ही Ninject CommonServiceLocator/Bootstrapper का उपयोग कर रहे हैं:

private static IKernel CreateKernel() { 
    var kernel = new StandardKernel(); 
    RegisterServices(kernel); 

    GlobalConfiguration.Configuration.ServiceResolver 
     .SetResolver(new NinjectServiceLocator(kernel)); 
    return kernel; 
}