如何为Quartz.NET作业集成依赖注入并注入Logger?
解决Quartz.NET作业中注入Logger的问题
正确配置步骤:
修改KasaJob类,添加Logger构造函数
在Job类中注入ILogger<KasaJob>,并在执行逻辑中使用:public class KasaJob : IJob { private readonly ILogger<KasaJob> _logger; public KasaJob(ILogger<KasaJob> logger) { _logger = logger; } public Task Execute(IJobExecutionContext context) { _logger.LogInformation("KasaJob执行于:{Time}", DateTime.UtcNow); // 执行你的任务逻辑 return Task.CompletedTask; } }调整Quartz服务配置
必须明确启用Microsoft依赖注入作业工厂,并通过AddJob+AddTrigger的方式配置Job,替代原有的ScheduleJob<T>快捷方式:HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); // 确保日志服务已添加(默认Host创建时已包含,可省略但建议保留) builder.Services.AddLogging(); builder.Services.AddQuartz(q => { // 启用Microsoft DI作业工厂,让Quartz从DI容器获取Job实例 q.UseMicrosoftDependencyInjectionJobFactory(); // 注册KasaJob到Quartz,并指定唯一标识 q.AddJob<KasaJob>(opts => opts.WithIdentity("KasaJob")); // 为注册的Job添加触发器 q.AddTrigger(opts => opts .ForJob("KasaJob") .StartAt(DateBuilder.EvenSecondDate(DateTimeOffset.UtcNow.AddSeconds(2))) .WithSimpleSchedule(t => t.WithIntervalInSeconds(10).RepeatForever()) .WithIdentity("KasaJobTrigger")); }); builder.Services.AddQuartzHostedService(options => { options.WaitForJobsToComplete = true; }); using IHost host = builder.Build(); await host.RunAsync();
关键说明:
- 原
ScheduleJob<T>方式会让Quartz自行实例化Job,不会调用DI容器,因此无法解析构造函数中的Logger依赖。 UseMicrosoftDependencyInjectionJobFactory()必须显式调用,确保Quartz使用DI容器创建Job实例。- 无需单独调用
builder.Services.AddTransient<KasaJob>(),q.AddJob<KasaJob>()会自动将Job注册到DI容器(默认生命周期为Transient)。
内容的提问来源于stack exchange,提问作者AngryHacker
相关产品推荐
相关产品推荐

