2014-04-29 11 views
11

So che ci sono diverse domande un po 'come questa, ma dato che non sono in grado di trovare alcuna documentazione e nessuna delle altre domande ha alcuna risposta che mi aiuti, ecco:Ottenere l'ultima versione di Ninject che funziona con MVC 5/Web Api 2 più recente?

Creo un nuovo ASP. Applicazione NET (VS2013), MVC è selezionato, aggiungo API. Eseguo "update-package" nella Package Console per essere aggiornato alle ultime versioni (MVC 5.1.2, Web Api 5.1.2).

Quindi aggiungo i nuovi pacchetti Ninject.MVC5 e Ninject.Web.WebApi.

ho aggiungere queste righe al file web.config (Ninject vuole versione 5.0, ho 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> 

Negli App_start/NinjectWebCommon.cs il file aggiungo un unico legame:

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

Quindi aggiungo un singolo ApiController, con ILogger come singolo parametro nel costruttore e aggiungo ILogger come parametro al costruttore di HomeController.

Che dovrebbe essere per testare?

Mi manca qualche cablaggio per WebApi? Oppure succede "dietro le quinte"?

In ogni caso, il controller acessing api mi dà questo errore:

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

E cercando il HomeController mi dà questo:

Object reference not set to an instance of an object.

Ho provato la stessa cosa, senza l'aggiornamento agli ultimi pacchetti , stesso problema. Ho usato Ninject per anni con MVC 3 (ho anche provato il pacchetto Ninject.MVC3), e sono totalmente privo di idee sul motivo per cui ciò non funziona. Con WebApi, mi aspettavo qualche chiamata a SetResolver, ma ..

Qualsiasi aiuto sarebbe appagato!

risposta

10

Questo non è un MVC/problema WebAPI

la configurazione è sbagliata:

kernel.Bind<ILogger, NLogLogger>(); 
.210

dovrebbe essere

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

Ecco cosa succede quando lavori con Ninject per anni, ma con un'astrazione intermedia! Grazie mille! Giusto per chiarire, cosa intendevi con "Registra l'ILogger una volta per entrambi" è che lo registro una sola volta e poi funziona sia per MVC che per WebApi? Almeno quello che sembra essere successo. –

+1

@Remo Gloor: la tua risposta ha un errore di sintassi. Aggiungi '()' dopo 'kernel.Bind '. Quindi il codice di risposta completo sarà: 'kernel.Bind () .To ();'. Sono stanco di migliorare questa risposta, ma a quanto pare i ragazzi di Revisione non hanno trovato nulla di utile nel correggere l'errore di sintassi !!! –

13

Come indicato dallo documentation Ninject.Web.WebApi non è un pacchetto Nuget standalone. Scegli il pacchetto Ninject.Web.WebApi. * Adatto alla tua applicazione. Molto probabilmente lo farà da Ninject.Web.WebApi.WebHost nel tuo caso.

  1. Creare un'applicazione Web vuoto
  2. Installare Ninject.MVC5
  3. Installa Ninject.Web.WebApi.WebHost
  4. Aggiornamento tutto Nuget pacchetti
  5. Creare un controller MVC e ApiController che prendono una dipendenza ILogger
  6. Registrare l'ILogger una volta sia per MVC e WebAPI
  7. Run
+0

Grazie per il link, idea del perché Google non ha trovato questo. Ho fatto come hai scritto (e ho aggiunto le cose al file web.config come ho scritto nella domanda, non funziona senza), ottenendo sempre gli stessi errori. Quando scrivi Register the ILogger una volta per ENTRAMBI, cosa significa? Non riesco a trovare nulla sul cablaggio della parte WebApi ancora. (Il mio progetto di base è qui: https://bitbucket.org/steentottrup/mvc5webapi2ninjecttest) –

+0

Grazie Remo, questa risposta è semplice e ha funzionato per me mentre ho provato molte risposte su google. Solo per riferimento, per il mio progetto sto usando MVC5 e Web Api. – Alex

3

Per utilizzare Ninject in un progetto con MVC e WebApi è necessario installare i seguenti pacchetti:

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

Questi pacchetti aggiungono i seguenti file App_Start cartella:
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

Questo non funzionerà per WebApi. –

+0

Perché aggiungere questa linea due volte? DynamicModuleUtility.RegisterModule (typeof (NinjectHttpModule)); – usefulBee

Problemi correlati