C# 控制器没有默认构造函数-Ninject、Owin、Web Api

C# 控制器没有默认构造函数-Ninject、Owin、Web Api,c#,asp.net-mvc,asp.net-web-api,ninject,owin,C#,Asp.net Mvc,Asp.net Web Api,Ninject,Owin,我正在将MVC/WebApi应用程序迁移到使用Owin,但是在安装了所有组件并将所有配置从globals.asax移动到Startup.cs之后,我得到了一个错误类型“EventController”没有默认构造函数 我配置ninject的方式似乎无法正常工作。有人能发现错误吗 事件控制器 public class EventController : BaseApiController { private readonly IAttendeeService attendeeService

我正在将MVC/WebApi应用程序迁移到使用Owin,但是在安装了所有组件并将所有配置从globals.asax移动到Startup.cs之后,我得到了一个错误
类型“EventController”没有默认构造函数

我配置ninject的方式似乎无法正常工作。有人能发现错误吗

事件控制器

public class EventController : BaseApiController
{
    private readonly IAttendeeService attendeeService;
    private readonly IEventService eventService;
    private readonly IExcelService excelService;

    public EventController(IEventService eventService, IAttendeeService attendeeService, IExcelService excelService)
    {
        this.attendeeService = attendeeService;
        this.eventService = eventService;
        this.excelService = excelService;
    }
}
这是startup.cs类

using System.Linq;
using System.Net.Http.Formatting;
using System.Reflection;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Filanthropy.Core;
using Filanthropy.Model.Models;
using Filanthropy.Services;
using Filanthropy.Web;
using Filanthropy.Web.App_Start;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Newtonsoft.Json.Serialization;
using Ninject;
using Ninject.Web.Common;
using Ninject.Web.Common.OwinHost;
using Ninject.Web.WebApi.OwinHost;
using Owin;

[assembly: OwinStartup(typeof(Startup))]
namespace Filanthropy.Web
{
    public partial class Startup
    {

        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration httpConfig = new HttpConfiguration();

            ConfigureOAuthTokenGeneration(app);

            ConfigureWebApi(httpConfig);

            app.UseCors(CorsOptions.AllowAll);

            app.UseWebApi(httpConfig);

            app.MapSignalR();

            app.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(httpConfig);


            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AutoMapperConfig.Configure();
        }

        private void ConfigureOAuthTokenGeneration(IAppBuilder app)
        {
            // Configure the db context and user manager to use a single instance per request
            app.CreatePerOwinContext(FilanthropyContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

            // Plugin the OAuth bearer JSON Web Token tokens generation and Consumption will be here

        }

        private void ConfigureWebApi(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{id}",
               defaults: new { id = RouteParameter.Optional }
               );

            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        }

        private static StandardKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Load(Assembly.GetExecutingAssembly());

            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)
        {
            kernel.Bind<IDbContext>().To<FilanthropyContext>().InRequestScope();
            kernel.Bind<IEventService>().To<EventService>().InRequestScope();
            kernel.Bind<IAttendeeService>().To<AttendeeService>().InRequestScope();
            kernel.Bind<IProjectService>().To<ProjectService>().InRequestScope();
            kernel.Bind<IPaymentService>().To<PaymentService>().InRequestScope();
            kernel.Bind<IPledgeService>().To<PledgeService>().InRequestScope();
            kernel.Bind<IExcelService>().To<ExcelService>();

            kernel.Bind<IUserStore<ApplicationUser>>()
                .To<UserStore<ApplicationUser>>()
                .WithConstructorArgument("context", context => kernel.Get<FilanthropyContext>());
        }       


    }
}
使用System.Linq;
使用System.Net.Http.Formatting;
运用系统反思;
使用System.Web.Http;
使用System.Web.Mvc;
使用System.Web.Optimization;
使用System.Web.Routing;
使用丝虫学核心;
使用Filanthropy.Model.Models;
使用荧光显微镜检查服务;
使用filantropy.Web;
使用filantropy.Web.App_启动;
使用Microsoft.AspNet.Identity;
使用Microsoft.AspNet.Identity.EntityFramework;
使用Microsoft.Owin;
使用Microsoft.Owin.Cors;
使用Newtonsoft.Json.Serialization;
使用Ninject;
使用Ninject.Web.Common;
使用Ninject.Web.Common.OwinHost;
使用Ninject.Web.WebApi.OwinHost;
使用Owin;
[组件:OwinStartup(类型(启动))]
名称空间filantropy.Web
{
公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
HttpConfiguration httpConfig=新的HttpConfiguration();
配置OAuthTokenGeneration(应用程序);
配置webapi(httpConfig);
应用程序UseCors(CorsOptions.AllowAll);
app.UseWebApi(httpConfig);
app.mapsigner();
UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(httpConfig);
RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutoMapperConfig.Configure();
}
私有void配置OAuthTokenGeneration(IAppBuilder应用程序)
{
//将db上下文和用户管理器配置为每个请求使用一个实例
app.CreatePerOwinContext(FilanthropyContext.Create);
app.CreatePerOwinContext(ApplicationUserManager.Create);
//插件OAuth承载JSON Web令牌的生成和使用将在此处显示
}
私有void配置webapi(HttpConfiguration配置)
{
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
var jsonFormatter=config.Formatters.OfType().First();
jsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();
}
私有静态StandardKernel CreateKernel()
{
var kernel=新的标准内核();
Load(Assembly.getExecutionGassembly());
注册服务(内核);
返回内核;
}
/// 
///在这里加载您的模块或注册您的服务!
/// 
///内核。
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InRequestScope();
kernel.Bind().To().InRequestScope();
kernel.Bind().To().InRequestScope();
kernel.Bind().To().InRequestScope();
kernel.Bind().To().InRequestScope();
kernel.Bind().To().InRequestScope();
kernel.Bind().To();
kernel.Bind()
.至()
.WithConstructorArgument(“context”,context=>kernel.Get());
}       
}
}

您需要告诉Ninject如何正确解析Web API依赖关系

编辑:NinjectWebCommon.cs并更新CreateKernel()方法以包括:GlobalConfiguration.Configuration.DependencyResolver=新的NinjectResolver(内核)

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

        //Note: Add the line below:
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);

        return kernel;
    }
    catch
    {
        kernel.Dispose();
        throw;
    }
}
private静态IKernel CreateKernel()
{
var kernel=新的标准内核();
尝试
{
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
//注:添加以下行:
GlobalConfiguration.Configuration.DependencyResolver=新的NinjectResolver(内核);
返回内核;
}
抓住
{
Dispose();
投掷;
}
}

您需要告诉Ninject如何正确解析Web API依赖关系

编辑:NinjectWebCommon.cs并更新CreateKernel()方法以包括:GlobalConfiguration.Configuration.DependencyResolver=新的NinjectResolver(内核)

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

        //Note: Add the line below:
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);

        return kernel;
    }
    catch
    {
        kernel.Dispose();
        throw;
    }
}
private静态IKernel CreateKernel()
{
var kernel=新的标准内核();
尝试
{
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
//注:添加以下行:
GlobalConfiguration.Configuration.DependencyResolver=新的NinjectResolver(内核);
返回内核;
}
抓住
{
Dispose();
投掷;
}
}

我知道这是一个旧的线程,并将解决方案标记为答案,但这些都不适用于我,并找到了另一个适用于我的解决方案。为可能仍面临问题的其他人发布

我将ASP.NET MVC 5与VS 2017和Ninject一起使用。我实现了该线程中提到的所有建议,但仍然出现“没有默认构造函数”运行时错误。
我安装了Ninject.MVC5 nuget包,它运行正常

我知道这是一个古老的思路,有一些解决方案被标记为答案,但这些都不适用于我,而是找到了另一个适用于我的解决方案。为可能仍面临问题的其他人发布

我将ASP.NET MVC 5与VS 2017和Ninject一起使用。我实现了所有的