使用NInject和Web API 2使用控制器中的路由属性



我有一个实现ninject的Web API 2项目。如果我的控制器不使用路由属性,则可以正常工作,但是,如果我使用它们,则该应用程序返回以下例外:"尝试创建类型'AccountsScontroller'的控制器时发生错误构造函数。"

工作正常

public IHttpActionResult get()
{
    var entities = EntityService.getAll();
    return Ok(entities);
}

不工作

[Route("user")]
public IHttpActionResult get()
{
    var entities = EntityService.getAll();
    return Ok(entities);
}

我安装了以下软件包

Ninject version="3.2.0.0"
Ninject.Extensions.ContextPreservation version="3.2.0.0" 
Ninject.Extensions.NamedScope version="3.2.0.0"
Ninject.Web.Common version="3.2.0.0"
Ninject.Web.Common.OwinHost version="3.2.3.0" 
Ninject.Web.Common.WebHost version="3.2.3.0"
Ninject.Web.WebApi version="3.2.4.0"
Ninject.Web.WebApi.OwinHost version="3.2.4.0"
Ninject.Web.WebApi.WebHost

我的nintextwebcommon类是

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(ProperdiAPI.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(ProperdiAPI.App_Start.NinjectWebCommon), "Stop")]
namespace ProperdiAPI.App_Start
{
    using Microsoft.Web.Infrastructure.DynamicModuleHelper;
    using Ninject;
    using Ninject.Web.Common;
using System;
    using System.Web;
    using System.Web.Http;
    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);
        }
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }
        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;
            }
        }
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IEntityService>().To<EntityService>().InRequestScope();
        }
    }
}

baseapicontroller

public class BaseApiController : ApiController
    {
        private IEntityService entitysService;
        public BaseApiController(IEntityService entityService)
        {
            this.entityService = entityService;
        }
         protected IEntityService EntitysService
         {
             get
             {
                return this.entityService;
             }
         }
        protected IHttpActionResult GetErrorResult(IdentityResult result)
        {
            if (result == null)
            {
                return InternalServerError();
            }
            if (!result.Succeeded)
            {
                if (result.Errors != null)
                {
                    foreach (string error in result.Errors)
                    {
                        ModelState.AddModelError("", error);
                    }
                }
                if (ModelState.IsValid)
                {
                    return BadRequest();
                }
                return BadRequest(ModelState);
            }
            return null;
        }
    }
}

控制器

[RoutePrefix("api/accounts")]
public class AccountsController : BaseApiController
{
    public AccountsController(IEntityService entityService)
    :base(entityService)
    {
    }
    [HttpGet]
    //[Route("user")]
    public IHttpActionResult get()
    {
        var entities = EntityService .getAll();
        return Ok(entities);
    }
}

我尝试了很多事情,例如构建自定义解析器和范围,安装了旧的ninject版本等等,但是没有任何作用。

预先感谢!

安装插件Ninject.WebApi.DependencyResolver并在致电后添加此代码 RegisterServices(kernel);

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

最新更新