You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:52:11