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

如何注入方法返回值?IBusinessResult依赖注入异常求助

问题解决:BusinessResult依赖注入失败与空引用异常

问题根源

  1. 注入未完成赋值:你在UserBusiness中声明了_businessResult字段,但从未通过构造函数或其他方式让DI容器为其赋值,导致调用时字段为null,触发空引用异常。
  2. 生命周期选型错误:BusinessResult是带状态的类(拥有可变的Success、Result等属性),注册为Singleton会让所有请求共享同一个实例,必然引发多线程下的状态混乱、数据污染问题。

修复方案

方案1:修正依赖注入流程

步骤1:修改构造函数完成注入

在UserBusiness的构造函数中添加IBusinessResult参数,让DI容器自动注入实例:

private readonly ILogger _logger;
private readonly DbEntities _db;
private readonly IBusinessResult _businessResult;

public UserBusiness(ILogger logger, DbEntities db, IBusinessResult businessResult)
{
    _logger = logger;
    _db = db;
    _businessResult = businessResult;
}

步骤2:调整服务注册生命周期

将Singleton改为Transient(每次请求获取全新实例,避免状态共享):

// Program.cs中更新注册代码
builder.Services.AddTransient<IBusinessResult, BusinessResult>();

方案2:直接创建实例(更推荐)

BusinessResult本质是业务返回结果的载体,属于数据传输类,这类类不需要依赖注入,直接在方法内创建新实例更简单安全:

private IBusinessResult Validate(User model, ValidationType validationType)
{
    var businessResult = new BusinessResult();
    try
    {
        // 你的验证逻辑
        businessResult.Success = true;
    }
    catch (Exception ex)
    {
        businessResult.Exception = ex;
        _logger.LogError($"UserBusiness.Validate - ValidationType: {validationType.ToString()}\r\nModel: {JsonSerializer.Serialize<User>(model)}");
        throw;
    }
    return businessResult;
}

这种方式无需在DI容器中注册IBusinessResult,彻底避免生命周期冲突,同时保证每次验证都有独立的结果实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:20:27