.NET 6中Quartz.NET 3.7如何通过依赖注入注入DbContext?
在.NET 6中为Quartz.NET 3.7的Job注入DbContext
1. 配置Quartz与.NET DI容器集成
首先确保安装Quartz.Extensions.DependencyInjection NuGet包,然后在Program.cs中完成DbContext和Quartz的注册:
var builder = WebApplication.CreateBuilder(args); // 注册你的DbContext builder.Services.AddDbContext<PtmDBContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("YourConnectionString"))); // 配置Quartz builder.Services.AddQuartz(q => { // 注册具体的Job实现类(继承BaseJobMgr的子类) q.AddJob<YourConcreteJob>(opts => opts.WithIdentity("YourJobKey")); // 示例:配置触发器 q.AddTrigger(opts => opts .ForJob("YourJobKey") .WithIdentity("YourTriggerKey") .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever())); }); // 添加Quartz后台宿主服务 builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true); var app = builder.Build(); // ... 其他中间件配置 app.Run();
2. 修改BaseJobMgr的构造函数
调整基类构造函数,接收并存储DbContext,确保依赖能被DI容器注入:
public abstract class BaseJobMgr : IJob { protected readonly PtmDBContext _ctx; // 构造函数注入DbContext,添加空检查避免空引用 protected BaseJobMgr(PtmDBContext ctx) { _ctx = ctx ?? throw new ArgumentNullException(nameof(ctx)); } public abstract Task Execute(IJobExecutionContext context); }
3. 实现具体Job子类
创建继承自BaseJobMgr的具体Job类,DI会自动将DbContext传递到基类构造函数:
public class ConcreteJob : BaseJobMgr { public ConcreteJob(PtmDBContext ctx) : base(ctx) { } public override async Task Execute(IJobExecutionContext context) { // 直接使用基类的_ctx进行数据库操作 var data = await _ctx.YourTable.ToListAsync(); // ... 执行你的业务逻辑 } }
关键说明
Quartz.Extensions.DependencyInjection包是核心,它替换了Quartz默认的JobFactory,让Job实例能从.NET DI容器中解析,从而支持构造函数注入。- Job默认是瞬态实例,每次执行都会创建新的Job对象,DbContext的生命周期会被DI自动管理,避免并发问题。
内容的提问来源于stack exchange,提问作者gjo
相关产品推荐
相关产品推荐

