创建UserController失败:需无参公共构造函数(Autofac依赖注入问题)
解决Autofac集成Web API时控制器要求无参构造函数的问题
看起来你已经完成了大部分依赖注册工作,但Web API依然在尝试用默认方式实例化控制器——核心原因是你没有把Autofac设置为Web API的默认依赖解析器,这是Autofac集成Web API时最容易漏掉的关键步骤。
下面是具体的排查和修复步骤:
1. 补上Autofac依赖解析器的核心配置
你的RegisterServices方法已经注册了控制器和各类服务,但缺少将Autofac与Web API绑定的环节。在构建完容器后,必须明确告诉Web API用Autofac处理依赖注入:
// 通常在Global.asax的Application_Start方法中完成配置 protected void Application_Start() { // 先初始化Web API路由(这一步要放在Autofac配置之前) GlobalConfiguration.Configure(WebApiConfig.Register); var builder = new ContainerBuilder(); var container = RegisterServices(builder); // 关键:替换Web API的默认依赖解析器为Autofac GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); }
你的RegisterServices方法保持原有逻辑即可。
2. 确认控制器构造函数的访问权限
从你的代码看,UserController的构造函数已经是public的了,但还是要确认没有误改成internal或private——Web API需要通过公共构造函数完成依赖注入。
3. 检查依赖链的完整性
从堆栈跟踪的最后几行可以看到,Autofac的解析器已经被调用,但可能在解析IUnitOfWork的依赖时出现了问题,导致回退到默认激活器。你可以做以下检查:
- 确认
UnitOfWork的构造函数是否依赖了未注册的服务?比如它是否需要IDBFactory?(从你的注册代码看已经完成了IDBFactory的注册,但可以核对构造函数参数是否匹配) - 检查
UserContext的连接字符串配置是否正确?如果DbContext无法实例化,会导致整个依赖链解析失败 - 可以给
UnitOfWork的注册添加调试日志,验证是否能正常激活:builder.RegisterType<UnitOfWork>() .As<IUnitOfWork>() .InstancePerRequest() .OnActivated(e => Console.WriteLine("UnitOfWork 已成功激活")); // 调试用
4. 确认NuGet包版本匹配
如果你使用的是ASP.NET Web API 2,确保安装的是Autofac.WebApi2包,版本不匹配也可能导致解析器无法正常工作。
按照以上步骤调整后,Web API就会通过Autofac将IUnitOfWork注入到你的UserController中,不再要求无参构造函数了。
内容的提问来源于stack exchange,提问作者Aniruddha
相关产品推荐
相关产品推荐

