2014-04-29 10 views
11

Wiem, że jest kilka pytań podobnych do tego, ale ponieważ nie mogę zlokalizować żadnej dokumentacji i żadne z pozostałych pytań nie ma odpowiedzi, które mogłyby mi pomóc, oto:Uzyskanie najnowszego produktu Ninject przy użyciu najnowszego MVC 5/Web Api 2?

Tworzę nową ASP. Aplikacja NET (VS2013), wybrano MVC, dodaję API. Uruchamiam "update-package" w Konsoli pakietu, aby uzyskać aktualizacje do najnowszych wersji (MVC 5.1.2, Web Api 5.1.2).

Następnie dodajemy nowe pakiety Ninject.MVC5 i Ninject.Web.WebApi.

dodać te linie do pliku web.config (Ninject chce wersji 5.0, mam 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> 

W App_start/NinjectWebCommon.cs złożyć dodam jedno wiązanie:

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

Następnie dodaję pojedynczy ApiController, z ILogger jako pojedynczym parametrem w konstruktorze, i dodaję ILogger jako parametr do konstruktora HomeController.

To powinno być testowanie?

Czy brakuje niektórych przewodów dla WebApi? Czy to się dzieje "za kulisami"?

Zresztą acessing kontroler api daje mi ten błąd:

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

i stara się HomeController daje mi to:

Object reference not set to an instance of an object.

Próbowałem to samo, bez aktualizacji do najnowszych pakietów , taki sam problem. Używam programu Ninject od lat z MVC 3 (próbowałem również pakietu Ninject.MVC3) i nie mam pojęcia, dlaczego to nie działa. W WebApi spodziewałem się, że zadzwonię do SetResolver, ale ..

Każda pomoc byłaby przydatna!

Odpowiedz

10

To nie jest MVC/WebAPI problem

konfiguracja jest źle:

kernel.Bind<ILogger, NLogLogger>(); 

powinny być

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

Tak dzieje się, gdy pracujesz z Ninject od lat, ale z abstrakcją pomiędzy! Dziękuję bardzo! Aby wyjaśnić, co masz na myśli, mówiąc: "Zarejestruj ILogger raz dla obu", czy rejestruję go raz, a następnie działa zarówno dla MVC, jak i WebApi? Przynajmniej to, co się wydarzyło. –

+1

@Remo Gloor: Twoja odpowiedź zawiera błąd składni. Dodaj "()" po "kernel.Bind ". Tak więc pełny kod odpowiedzi będzie następujący: 'kernel.Bind () .To ();'. Zmęczyłem się ulepszaniem tej odpowiedzi, ale najwyraźniej recenzenci nie znaleźli nic przydatnego w korygowaniu błędu składni !!! –

13

Jak wspomniano w artykule documentation Ninject.Web.WebApi nie jest samodzielnym pakietem Nuget. Wybierz odpowiedni pakiet Ninject.Web.WebApi. * Dla swojej aplikacji. Najprawdopodobniej zrobi to Ninject.Web.WebApi.WebHost w twoim przypadku.

  1. tworzyć puste Web Application
  2. instaluję Ninject.MVC5
  3. Install Ninject.Web.WebApi.WebHost
  4. Aktualizacja wszystko Nuget pakiety
  5. utworzyć kontroler MVC i ApiController że biorą zależność ILogger
  6. zarejestrować ILogger raz zarówno dla MVC i WebAPI
  7. Run
+0

Dziękuję za link, nie wiem, dlaczego Google nie znaleźliśmy tego. Zrobiłem tak jak napisałeś (i dodałeś rzeczy do pliku web.config, jak napisałem w pytaniu, to nie działa bez), wciąż otrzymuję te same błędy. Kiedy piszesz Zarejestruj ILogger raz na OBU, co to znaczy? Nie udało mi się zlokalizować niczego na temat okablowania części WebApi. (Mój podstawowy projekt jest tutaj: https://bitbucket.org/steentottrup/mvc5webapi2ninjecttest) –

+0

Dziękuję Remo, ta odpowiedź jest prosta i działała dla mnie, gdy próbowałem wielu odpowiedzi w google. Dla własnego odniesienia, dla mojego projektu używam MVC5 i Web Api. – Alex

3

Do korzystania Ninject w projekcie z MVC i WebApi trzeba zainstalować następujące pakiety:

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

Te pakiety dodać następujące pliki do App_Start folderu:
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

To nie zadziała dla WebApi. –

+0

Po co dodawać tę linię dwa razy? DynamicModuleUtility.RegisterModule (typeof (NinjectHttpModule)); – usefulBee

Powiązane problemy