2014-04-29 5 views
11

मुझे पता है कि इस तरह के कई प्रश्न हैं, लेकिन जैसा कि मैं किसी भी दस्तावेज का पता लगाने में असमर्थ हूं और किसी अन्य प्रश्न में कोई भी उत्तर नहीं है जो मेरी मदद करता है, यहां जाता है:नवीनतम एमवीसी 5/वेब एपीआई 2 के साथ काम कर रहे नवीनतम निनजेक प्राप्त करना?

मैं एक नया एएसपी बना देता हूं। नेट एप्लिकेशन (वीएस2013), एमवीसी का चयन किया गया है, मैं एपीआई जोड़ता हूं। मैं नवीनतम संस्करणों (एमवीसी 5.1.2, वेब एपीआई 5.1.2) में अपडेट होने के लिए पैकेज कंसोल में "अपडेट-पैकेज" चलाता हूं।

फिर मैं नया Ninject.MVC5 और Ninject.Web.WebApi पैकेज जोड़ता हूं।

मैं web.config फ़ाइल में ये पंक्तियां जोड़ने (Ninject संस्करण 5.0 चाहता है, मैं 5.1 है):

 <dependentAssembly> 
      <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" /> 
      <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
      <assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" /> 
      <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" /> 
     </dependentAssembly> 

App_start/NinjectWebCommon.cs में दाखिल मैं एक ही बंधन जोड़ें:

private static void RegisterServices(IKernel kernel) { 
     kernel.Bind<ILogger, NLogLogger>(); 
    } 

फिर मैं एक एकल एपीकंट्रोलर जोड़ता हूं, इलोगर के साथ कन्स्ट्रक्टर में एकल पैरामीटर के रूप में, और मैं होमकंट्रोलर के कन्स्ट्रक्टर को पैरामीटर के रूप में आईएलओगर जोड़ता हूं।

यह परीक्षण के लिए होना चाहिए?

क्या मुझे वेबएपी के लिए कुछ तारों की याद आ रही है? या क्या यह "दृश्यों के पीछे" होता है?

वैसे भी, एपीआई नियंत्रक acessing मुझे इस त्रुटि देता है:

An error occurred when trying to create a controller of type 'TestController'. Make sure that the controller has a parameterless public constructor.

और HomeController कोशिश कर मुझे देता है यह:

Object reference not set to an instance of an object.

मैं एक ही बात की कोशिश की है नवीनतम संकुल को अपडेट किए बिना, , एक ही समस्या है। मैं एमवीसी 3 के साथ वर्षों के लिए निनजेक्ट का उपयोग कर रहा हूं (मैंने Ninject.MVC3 पैकेज भी कोशिश की है), और पूरी तरह से अनजान हूं कि यह क्यों काम नहीं करता है। WebApi के साथ, मैं SetResolver को कुछ कॉल की उम्मीद कर रहा था, लेकिन ..

किसी भी मदद की सराहना की जाएगी!

उत्तर

10

यह एक MVC/नहीं है WebAPI मुद्दा

आपके विन्यास गलत है:

kernel.Bind<ILogger, NLogLogger>(); 

MVC के साथ एक परियोजना में Ninject का उपयोग कर के लिए किया जाना चाहिए

kernel.Bind<ILogger>().To<NLogLogger>(); 
+0

यह तब होता है जब आप निनजेक्ट के साथ वर्षों से काम करते हैं, लेकिन बीच में एक अमूर्तता के साथ! आपका बहुत बहुत धन्यवाद! बस स्पष्ट करने के लिए, "आप दोनों के लिए एक बार ILogger पंजीकृत करें" के साथ क्या मतलब है कि मैं इसे एक बार पंजीकृत करता हूं, और फिर यह एमवीसी और वेबएपी दोनों के लिए काम करता है? कम से कम ऐसा लगता है कि क्या हुआ है। –

+1

@ रीमो ग्लोर: आपके उत्तर में एक वाक्यविन्यास त्रुटि है। कृपया कर्नेल के बाद '()' जोड़ें। बाइंड करें। तो पूर्ण उत्तर कोड होगा: 'कर्नेल। ()। ();'। मैं इस जवाब में सुधार थक गया, लेकिन स्पष्ट रूप से समीक्षा लोगों को वाक्यविन्यास त्रुटि को ठीक करने में कोई चीज़ उपयोगी नहीं मिली !!! –

13

जैसा कि documentation द्वारा घोषित किया गया है Ninject.Web.WebApi एक स्टैंडअलोन Nuget पैकेज नहीं है। अपने आवेदन के लिए उचित Ninject.Web.WebApi। * पैकेज चुनें। सबसे अधिक संभावना है कि यह आपके मामले में Ninject.Web.WebApi.WebHost द्वारा होगा।

  1. खाली वेब अनुप्रयोग
  2. स्थापित Ninject.MVC5
  3. Ninject.Web.WebApi स्थापित करें बनाएँ।WebHost
  4. अद्यतन सभी Nuget पैकेज
  5. एक MVC नियंत्रक और ApiController कि एक ILogger निर्भरता
  6. दोनों MVC और वेबएपीआई के लिए रजिस्टर ILogger एक बार ले बनाएं
  7. भागो
+0

लिंक, कोई पता नहीं है कि क्यों Google नहीं मिला के लिए धन्यवाद। जैसा आपने लिखा है मैंने किया है (और वेब.कॉन्फिग फ़ाइल में सामान को जोड़ा है जैसा कि मैंने प्रश्न में लिखा था, यह बिना काम नहीं कर रहा है), फिर भी वही त्रुटियां मिल रही हैं। जब आप दोनों के लिए एक बार ILogger रजिस्टर लिखते हैं, तो इसका क्या अर्थ है? मैं अभी भी WebApi भाग तारों के बारे में कुछ भी पता लगाने में विफल रहता है। (मेरा बेस प्रोजेक्ट यहां है: https://bitbucket.org/steentottrup/mvc5webapi2ninjecttest) –

+0

धन्यवाद रेमो, यह उत्तर सीधे आगे है और मेरे लिए काम करता है जबकि मैंने Google पर बहुत सारे उत्तरों की कोशिश की है। बस मेरे प्रोजेक्ट के लिए, मैं एमवीसी 5 और वेब एपीआई का उपयोग कर रहा हूं। – Alex

3

और WebApi आप निम्नलिखित संकुल स्थापित किया है:

-Ninject 
-Ninject.MVC5 
-Ninject.Web 
-Ninject.Web.Common 
-Ninject.Web.Common.WebHost 
-Ninject.Web.WebApi 
-Ninject.Web.WebApi.WebHost 

इन पैकेजों App_Start फ़ोल्डर में निम्न फ़ाइलें जोड़ें:
NinjectWeb.cs:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Smartiz.UI.NinjectWeb), "Start")] 

namespace Smartiz.UI 
{ 
    using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

    using Ninject.Web; 

    public static class NinjectWeb 
    { 
     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     } 
    } 
} 

NinjectWebCommon.cs:

using System; 
using System.Web; 
using Microsoft.Web.Infrastructure.DynamicModuleHelper; 
using Ninject; 
using Ninject.Extensions.Conventions; 
using Ninject.Web.Common; 
using Smartiz.ClientServices; 
using Smartiz.UI; 
using WebActivatorEx; 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")] 
[assembly: ApplicationShutdownMethod(typeof(NinjectWebCommon), "Stop")] 

namespace Smartiz.UI 
{ 
    public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper Bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      Bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      Bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 
       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      //kernel.Bind(q => 
      // q.FromAssembliesMatching("Smartiz.ClientServices*") 
      // .SelectAllClasses() 
      // .InheritedFrom(typeof(BaseService)) 
      // .BindDefaultInterface() 
      // .Configure(c => c.InSingletonScope())); 
     }   
    } 
} 
+0

यह वेबएपी के लिए काम नहीं करेगा। –

+0

इस लाइन को दो बार क्यों जोड़ें? DynamicModuleUtility.RegisterModule (typeof (NinjectHttpModule)); – usefulBee

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