使用ASP.Net MVC 4 Web API和Ninject.Web.WebApi进行问题

mma*_*007 26 c# ninject asp.net-mvc-4 asp.net-web-api

我正在尝试将新的ASP.Net MVC 4 Web API项目模板与Ninject一起使用,但是在以下错误中遇到了障碍:

从程序集'Ninject.Web.WebApi,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7'类型'Ninject.Web.WebApi.Filter.DefaultFilterProvider'中的方法'GetFilters'没有实现.

我正在使用ASP.Net MVC 4 - > Web API模板在Visual Studio 2010中创建一个全新的项目,我正在使用最新的Ninject NuGet包:

  • Ninject 3.0.1.10
  • Ninject.Web.Common 3.0.0.7
  • Ninject.Web.WebApi 3.0.0.2

我尝试了这个问题中提出的解决方案,但是我没有运气 - 如果我删除对Ninject.Web.WebApi的引用,那么MVC永远不会使用Ninject.我也注意到他们提到了Ninject.MVC3但是我使用的是新的Ninject.WebApi插件.

我正在使用NinjectWebCommon.cs中的默认绑定代码,该代码是在NuGet安装期间创建的,并尝试在RegisterServices()中注册一个简单服务

[assembly: WebActivator.PreApplicationStartMethod(typeof(mkts.web.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(mkts.web.App_Start.NinjectWebCommon), "Stop")]

namespace mkts.web.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;
    using mkts.service;

    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();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            //Test binding
            kernel.Bind<IStudentService>().To<StudentService>();
        }        
    }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器:

namespace mkts.web.Controllers
{
    public class HomeController : Controller
    {
        private readonly IStudentService studentService;

        public HomeController(IStudentService studentService)
        {
            this.studentService = studentService;
        }


        public ActionResult Index()
        {
            return View();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您提供任何帮助.

Fil*_*p W 62

Ninject.WebApi是针对Beta编写的,现已弃用.

删除它,安装Ninject.MVC3.

现在您需要一个自制的IDependencyResolver和IDependencyScope.我在这里发布了一个演练 - http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/

  • Ninject团队是否有希望通过API兼容版本更新NuGet包? (20认同)
  • 这是菲利普的伟大贡献; 真有用,谢谢. (3认同)
  • 而已!我废弃了Ninject.Web.WebApi并替换为Ninject.MVC3,然后添加了自定义的DependencyResolver类,现在一切正常.我不知道在我的旅行中错过了Ninject.WebApi被弃用的事实,命名惯例让我觉得我认为一个名为Ninject.WebApi的插件将支持MVC 4 WebApi项目 - 他们应该真正更新nuget页面,因为它是不再支持.无论如何,非常感谢你的回答,这真的令人沮丧. (2认同)
  • 按照上面的链接并创建两个类NinjectScope和NinjectResolver确实解决了这个问题.我不需要Ninject.MVC3 (2认同)