C# 控制器没有默认构造函数-Ninject、Owin、Web Api
我正在将MVC/WebApi应用程序迁移到使用Owin,但是在安装了所有组件并将所有配置从globals.asax移动到Startup.cs之后,我得到了一个错误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
类型“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一起使用。我实现了所有的