分部控制器依赖注入时第二个构造函数未触发引发空引用异常问题
问题根因
C#的分部类(partial)仅为语法层面的代码拆分规则,编译后两个分部类会合并为同一个完整类,你的写法相当于给CommonController定义了两个重载的构造函数。而ASP.NET Core的DI容器解析控制器实例时,只会选择其中一个参数匹配的构造函数执行,不可能同时运行两个构造函数,所以未被调用的构造函数中赋值的字段自然为null,触发空引用异常。
解决方案
方案1:合并为统一构造函数(最推荐)
把两个分部类需要的所有依赖都放到同一个构造函数中注入,两个分部类仅分别声明各自需要的私有字段即可:
第一个分部类代码:
public partial class CommonController : BaseController { private readonly IStoreService _storeService; }
第二个分部类代码:
public partial class CommonController : BaseController { private readonly CommonSettings _commonSettings; private readonly ICommonModelFactory _commonModelFactory; // 统一注入所有依赖 public CommonController(IStoreService storeService, CommonSettings commonSettings, ICommonModelFactory commonModelFactory) { _storeService = storeService; _commonSettings = commonSettings; _commonModelFactory = commonModelFactory; } }
DI容器调用这个唯一构造函数后,所有字段都会被正确赋值。
方案2:使用属性注入(次选,适配不想修改构造函数的场景)
如果不需要强制依赖在构造阶段完成赋值,可以把第二个分部类的依赖改为属性注入,给属性加[FromServices]标记即可:
public partial class CommonController : BaseController { [FromServices] public CommonSettings _commonSettings { get; set; } [FromServices] public ICommonModelFactory _commonModelFactory { get; set; } }
DI容器会在构造函数执行完成后,自动给标记了[FromServices]的公共可写属性赋值。
内容的提问来源于stack exchange,提问作者Ahmed Zakaria
相关产品推荐
相关产品推荐

