使用ninject和Ninject.Web.Api进行Web Api 2在ASP.NET MVC 5中不起作用

时间:2016-06-19 09:22:04

标签: asp.net-mvc asp.net-web-api2 ninject ninject.web.mvc ninject.web

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

我使用nuget包管理器为web api 2包安装了ninject

this other answer

然后我使用nuget包管理器安装了Ninject.Web

enter image description here

然后在NinjectWebCommon中,我在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时,它正在工作。

这是我的web api控制器

 public class TestController : ApiController
    {
        private ICategoryRepo categoryRepo;

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

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

所以我发现它是为web api工作,但不适用于web项目。我在同一个项目中使用它们。

1 个答案:

答案 0 :(得分:9)

您需要安装Ninject.MVC5并为MVC设置DependencyResolver以及为WebApi设置DependencyResolver

// 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));