在DI容器或Main方法外调用Quartz.NET调度器的技术问题
Quartz.NET 调度器DI注入及外部访问问题
问题背景
我们计划使用Quartz.NET实现邮件发送、记录复制等定时任务,它适配性良好,但官方文档未针对DI容器及仓储工作单元模式更新相关内容,导致我们遇到了问题。
我们在解决方案中单独创建了JobRunner项目,用于存放调度器及各类Job,这些Job可调用业务服务层接口。当前核心问题是:在JobRunner项目的Main方法实例化调度器后,无法在外部获取该调度器的访问权限。
当前代码
Main文件代码
private static async Task Main(string[] args) { LogProvider.SetCurrentLogProvider(new ConsoleLogProvider()); // Grab the Scheduler instance from the Factory StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); // and start it off await scheduler.Start(); // and last shut down the scheduler when you are ready to close your program await scheduler.Shutdown(); }
典型Job代码
using Quartz; using Compyl.AppLogic.AssessmentService; namespace JobRunner.Jobs { public class AssessmentDuplicationJob : IJob { private readonly IAssessmentService _assessmentService; public AssessmentDuplicationJob(IAssessmentService assessmentService) { _assessmentService = assessmentService; } public async Task Execute(IJobExecutionContext context) { var dataMap = context.MergedJobDataMap; var id = dataMap.GetInt("id"); var shouldPopulateAnswers = dataMap.GetBoolean("shouldPopulateAnswers"); _assessmentService.DuplicateAssessment(id, shouldPopulateAnswers); } } }
需求
我们希望在JobRunner项目中创建一个通过DI持有调度器的类或方法,示例如下:
[Inject] IScheduler scheduler public ScheduleEntity (T entity) { var job = createJob(entity)//another method that creates the job and jobdatamap this is easy enough var trigger = createTrigger(entity)// same as above scheduler.ScheduleJob(job, trigger) }
随后可以在Web应用的任意位置调用ScheduleEntity方法。
内容的提问来源于stack exchange,提问作者Morks
相关产品推荐
相关产品推荐

