关于netcore DbContext 依赖注入生命周期不一致报错问题处理

1.  首先这个问题出现的主要原因,就是依赖注入的生命周期不一致导致。

 netcore 依赖注入周期主要有:

瞬时模式 (Transient)

  • 每次请求都会创建一个全新的实例
  • 适用于无状态、短暂的计算过程
  • 使用 services.AddTransient<TService>() 注册

作用域模式 (Scoped)

  • 在同一 HTTP 请求内共享同一个实例
  • 适用于数据库上下文等需要在请求内保持状态的服务
  • 使用 services.AddScoped<TService>() 注册

单例模式 (Singleton)

  • 整个应用程序生命周期内共享同一个实例
  • 适用于配置服务、缓存等全局共享对象
  • 使用 services.AddSingleton<TService>() 注册

当然,我们的DbContext , 默认是作用域模式,但是我们涉及到 Quartz 和 IHostedService,BackgroundService 等单例线程或者全生命周期的类中通过构造函数注入的时候,系统就会报一个作用域周期不一致的错误,在启动创建注入对象的代码段。

典型的案例就是 netcore DbContext 注入到Quartz 和 IHostedService,BackgroundService中

那么如何解决这个问题,既然作用域周期不一致,那么弄一致就行了,通过


builder.Services.AddDbContextFactory<BaseDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

通过AddDbContextFactory创建工厂模式的 数据库单例线程,此时就不会有任何问题,在使用Quartz 和 IHostedService,BackgroundService 使用依赖注入dbcontext的时候。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值