NInject依赖注入报错:控制器缺少公共无参构造函数
解决Ninject注入CarController时的“无参构造函数”报错
问题根源
报错提示要求控制器有公共无参构造函数,本质是Web API未使用Ninject作为依赖解析器,或者Ninject无法解析CarController依赖的RuleChecker的全部子依赖,导致默认控制器激活器无法创建控制器实例。
修复步骤
1. 修复RuleChecker构造函数的拼写错误
你的RuleChecker构造函数存在大小写拼写错误,会直接导致实例化失败:
public RuleChecker(ICheckCar carData, IRuleSet ruleset, IFactory factory) { // 错误写法:CareData= cardata; CarData = carData; // 修正为正确的变量名和参数名 RuleSet = ruleSet; Factory = factory; }
2. 补全所有依赖的Ninject绑定
RuleChecker依赖ICheckCar、IRuleSet、IFactory三个接口,你之前仅绑定了IRule到RuleChecker,缺少这三个接口的绑定会导致Ninject无法完成依赖链解析。需在RegisterServices中添加完整绑定:
private static void RegisterServices(IKernel kernel) { // 注册IRule到RuleChecker kernel.Bind<IRule>().To<RuleChecker>(); // 必须注册RuleChecker的所有依赖接口到对应实现类 kernel.Bind<ICheckCar>().To<你的CheckCar实现类>(); // 替换为实际实现类 kernel.Bind<IRuleSet>().To<你的RuleSet实现类>(); // 替换为实际实现类 kernel.Bind<IFactory>().To<你的Factory实现类>(); // 替换为实际实现类 }
3. 确保Ninject在应用启动时初始化
你的Global.asax未调用Ninject初始化方法,导致Web API仍使用默认控制器激活器。需在Application_Start中优先执行Ninject初始化:
public class WebApiApplication : HttpApplication { protected void Application_Start() { // 先初始化Ninject,设置依赖解析器 CreateKernel(); GlobalConfiguration.Configure(WebApiConfig.Register); var config = GlobalConfiguration.Configuration; config.Formatters.JsonFormatter.SerializerSettings.Converters.Add (new Newtonsoft.Json.Converters.StringEnumConverter()); } private static IKernel CreateKernel() { var kernel = default(IKernel); try { kernel = CommonDependencyRegistration.Setup(); kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); RegisterServices(kernel); GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); return kernel; } catch { kernel?.Dispose(); throw; } } private static void RegisterServices(IKernel kernel) { kernel.Bind<IRule>().To<RuleChecker>(); kernel.Bind<ICheckCar>().To<你的CheckCar实现类>(); kernel.Bind<IRuleSet>().To<你的RuleSet实现类>(); kernel.Bind<IFactory>().To<你的Factory实现类>(); } }
4. 确认Ninject.Web.WebApi包已安装
确保项目已通过NuGet安装Ninject.Web.WebApi(需匹配你的Web API版本,如Web API 2需安装对应适配版本),NinjectDependencyResolver类由该包提供,缺少此包会导致依赖解析器无法生效。
验证
完成上述修改后重启项目,Web API会通过Ninject解析CarController的依赖,不再要求无参构造函数。
内容的提问来源于stack exchange,提问作者Toni0123
相关产品推荐
相关产品推荐

