如何注入方法返回值?IBusinessResult依赖注入异常求助
问题解决:BusinessResult依赖注入失败与空引用异常
问题根源
- 注入未完成赋值:你在
UserBusiness中声明了_businessResult字段,但从未通过构造函数或其他方式让DI容器为其赋值,导致调用时字段为null,触发空引用异常。 - 生命周期选型错误:
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
相关产品推荐
相关产品推荐

