3

我正在开发一个Asp.NET MVC项目。我的项目也有web api。我在Visual Studio 3中使用ASP.NET MVC5和Web Api 2.我正在使用ninject进行依赖注入。我知道ninject for web不适用于Web Api 2.所以我尝试使用Ninject进行Web Api。请参阅下面的我的场景。使用Ninject和Ninject.Web.Api进行Web API Api 2在ASP.NET MVC中不起作用5

我使用的NuGet

enter image description here

然后我安装Ninject.Web包管理

enter image description here

然后在NinjectWebCommon,我添加使用NuGet包管理器安装用于网络API 2包ninject这行在RegisterServices

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时,它正在工作。

这里是我的网页API控制器

public class TestController : ApiController 
    { 
     private ICategoryRepo categoryRepo; 

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

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

所以,我发现了什么是它正在为网络API,但不工作的web项目。我在同一个项目中使用了两个。

+0

如果你想与一个标准的MVC控制器使用通过安装'的NuGet Ninject.MVC5'。 –

回答

6

您需要与DependencyResolver一起安装Ninject.MVC5和设置DependencyResolver为MVC为的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(kernel);在创建内核方法。它适用于两者。那么请问为什么?第二行不必要?我真的很想详细了解它。请你解释一下吗? –