DryIoc MVC项目新增API控制器报错:需无参公共构造函数
解决DryIoc集成MVC后API控制器无参构造函数错误
我之前处理过一模一样的问题,核心原因很明确:DryIoc对ASP.NET MVC和Web API的控制器激活逻辑是分开处理的,你只配置了MVC部分的依赖解析,API控制器还在使用默认的.NET控制器激活器——而默认激活器要求控制器必须有公开的无参构造函数,就会抛出你看到的错误。
下面是具体的解决步骤:
1. 确保同时注册MVC和API控制器到DryIoc容器
在你的容器配置代码(比如Startup.cs或者Global.asax的Application_Start方法里),除了注册MVC控制器,还要专门注册API控制器:
using DryIoc; using DryIoc.Mvc; using DryIoc.WebApi; using System.Web.Mvc; using System.Web.Http; // 初始化DryIoc容器 var container = new Container(); // 注册你的业务服务(示例) container.Register<IMyService, MyService>(Reuse.Singleton); // 注册MVC控制器 container.RegisterMvcControllers(System.Reflection.Assembly.GetExecutingAssembly()); // 关键:注册API控制器,这步你大概率漏掉了 container.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
2. 同时配置MVC和Web API的依赖解析器
容器注册完成后,要把DryIoc的解析器分别设置给MVC和Web API:
// 设置MVC的依赖解析器(你已经配置过这个,所以MVC控制器正常) DependencyResolver.SetResolver(new DryIocDependencyResolver(container)); // 新增:设置Web API的依赖解析器 GlobalConfiguration.Configuration.DependencyResolver = new DryIocWebApiDependencyResolver(container);
如果你用的是Owin托管模式,要在Web API的配置块里设置解析器:
app.UseWebApi(config => { config.DependencyResolver = new DryIocWebApiDependencyResolver(container); // 其他Web API路由、过滤器配置... });
3. 验证API控制器的依赖是否正确注册
如果完成上面两步还是报错,检查你的API控制器构造函数里的依赖服务是否已经在DryIoc容器中注册。比如你的xxxController构造函数是这样的:
public class xxxController : ApiController { private readonly IMyService _myService; public xxxController(IMyService myService) { _myService = myService; } }
那必须确保IMyService已经通过container.Register<IMyService, MyService>()这类代码注册到容器中——否则DryIoc无法解析依赖,还是会回退到默认激活器,触发无参构造的错误。
这样配置后,DryIoc就会接管API控制器的创建过程,自动注入构造函数中的依赖,不再要求无参构造函数了。
内容的提问来源于stack exchange,提问作者Kemi Awosile
相关产品推荐
相关产品推荐

