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

ASP.NET Core控制器基类依赖注入不生效报CS7036错误如何解决

问题原因

这个报错是两个层面的规则共同导致的:

  1. C#继承的语法要求:子类构造函数默认会调用基类的无参构造函数,你自定义的基类AppControllerBase<T>只提供了带ILogger<T>参数的构造函数,没有无参构造,所以子类必须显式将参数传递给基类的带参构造函数,这是编译层面的要求,和DI框架无关。
  2. 依赖注入的工作逻辑:ASP.NET Core DI框架只会实例化最终被路由匹配到的子类控制器(也就是你代码里的TestController),只会处理这个子类构造函数的参数注入,不会自动为基类的构造函数传递参数。
解决方案

方案1:子类构造显式传参(推荐)

给子类添加构造函数,接收日志实例后传递给基类,这是最符合DI最佳实践的写法,依赖显式声明,支持单元测试,无使用限制:

public class TestController : AppControllerBase<TestController>
{
    public TestController(ILogger<TestController> logger) : base(logger)
    {
    }
}

public class AppControllerBase<T> : ControllerBase
{
    protected readonly ILogger<T> _logger;
    
    public AppControllerBase(ILogger<T> logger)
    {
        _logger = logger;
    }
}

方案2:基类使用属性注入

如果不想每个子类都重复写构造传参的代码,可以利用ASP.NET Core控制器原生支持的属性注入能力,修改基类实现:

public class TestController : AppControllerBase<TestController>
{
    // 无需编写构造函数
}

public class AppControllerBase<T> : ControllerBase
{
    [FromServices]
    protected ILogger<T> _logger { get; set; }
}

注意:属性注入是在对象构造完成后才会赋值,不要在基类或子类的构造函数中访问这个日志属性,否则会拿到null值。

方案3:服务定位器模式(不推荐)

也可以在基类中通过请求上下文直接解析服务,省去注入步骤,但属于依赖注入反模式,不利于单元测试,仅做参考:

using Microsoft.Extensions.DependencyInjection;

public class AppControllerBase<T> : ControllerBase
{
    protected ILogger<T> _logger => HttpContext?.RequestServices.GetRequiredService<ILogger<T>>();
}

内容的提问来源于stack exchange,提问作者Marko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:00:01