3

Я разрабатываю проект Asp.NET MVC. В моем проекте также есть веб-апи. Я использую ASP.NET MVC5 и Web Api 2 с Visual Studio 3. Я делаю инъекцию зависимости, используя ninject. Я знаю, что ninject для Интернета не работает для Web Api 2. Поэтому я попытался использовать Ninject для Web Api. См. Мой сценарий ниже.Использование ninject с Ninject.Web.Api для Web Api 2 не работает в ASP.NET MVC 5

Я установил Ninject для веб-апи 2 пакета с помощью NuGet менеджер пакетов

enter image description here

Затем я установил Ninject.Web используя NuGet менеджер пакетов

enter image description here

Тогда в NinjectWebCommon, я добавил эта линия в РегистрСервис

private static void RegisterServices(IKernel kernel) 
     { 
      System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel); 
      kernel.Bind<ICategoryRepo>().To<CategoryRepo>(); 
     }  

Это мой полный класс NinjectWebCommon регистрация одну зависимости

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(PatheinFashionStore.Web.App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(PatheinFashionStore.Web.App_Start.NinjectWebCommon), "Stop")] 

namespace PatheinFashionStore.Web.App_Start 
{ 
    using System; 
    using System.Web; 

    using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

    using Ninject; 
    using Ninject.Web.Common; 
    using PatheinFashionStore.Domain.Abstract; 
    using PatheinFashionStore.Domain.Concrete; 

    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>(); 
       System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel); 
       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<ICategoryRepo>().To<CategoryRepo>(); 
     }   
    } 
} 

Это мой контроллер

public class HomeController : Controller 
    { 
     private ICategoryRepo categoryRepo; 

     public HomeController(ICategoryRepo categoryRepoParam) 
     { 
      this.categoryRepo = categoryRepoParam; 
     } 

     public ActionResult Index() 
     { 
      return View(); 
     } 
} 

Затем, когда я запускаю мой код, он дает мне эту ошибку

enter image description here

Факс Добавь номер факса

Но когда я обращаюсь к apiController, он работает.

Вот мой веб-контроллер апи

public class TestController : ApiController 
    { 
     private ICategoryRepo categoryRepo; 

     public TestController(ICategoryRepo categoryRepoParam) 
     { 
      this.categoryRepo = categoryRepoParam; 
     } 

     public string Get() 
     { 
      this.categoryRepo.Create(); 
      return "OK"; 
     } 
    } 

Так что я узнал, что он работает на веб-API, но не работает для веб-проекта. Я использую оба в том же проекте.

+0

Установка 'Ninject.MVC5' через NuGet, если вы хотите использовать со стандартным MVC контроллер. –

ответ

6

Вам необходимо установить и настроить Ninject.MVC5 в DependencyResolver для MVC вместе с DependencyResolver для WebAPI

// Web Api 
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel); 

// MVC 
System.Web.Mvc.DependencyResolver.SetResolver(new Ninject.Web.Mvc.NinjectDependencyResolver(kernel)); 
+0

Спасибо. Оно работает. Но я добавил только эту строку System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver (ядро); в создании метода ядра. Он работает для обоих. Поэтому, пожалуйста, почему? Вторая строка не нужна? Я действительно хотел бы узнать это подробно. Пожалуйста, объясните об этом? –