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的时候。
957

被折叠的 条评论
为什么被折叠?



