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

分部控制器依赖注入时第二个构造函数未触发引发空引用异常问题

问题根因

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:15:03