ASP.NET Core控制器基类依赖注入不生效报CS7036错误如何解决
问题原因
这个报错是两个层面的规则共同导致的:
- C#继承的语法要求:子类构造函数默认会调用基类的无参构造函数,你自定义的基类
AppControllerBase<T>只提供了带ILogger<T>参数的构造函数,没有无参构造,所以子类必须显式将参数传递给基类的带参构造函数,这是编译层面的要求,和DI框架无关。 - 依赖注入的工作逻辑: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
相关产品推荐
相关产品推荐

