在Quartz .NET的工作类中使用依赖注入
Quartz .NET默认的Execute方法是不支持非空的构造函数的,所以.net core常用的构造函数依赖注入也搞不来,网上搜索一番搞定了这个问题。
解决方案简单来说就是自定义一个任务工厂,替换Quartz的默认工厂,下面是一个小例子。
新建一个控制台项目,创建一个接口,一个类继承这个接口,它们用于展示依赖注入。
IMySql接口
namespace IMySql
{
public interface IMySqlInterface
{
void Query();
}
}
SqlServerHelpr类继承IMySql接口
using System;
using IMySql; namespace MySqlServerTest
{
public class SqlServerHelpr : IMySqlInterface
{
public void Query()
{
Console.WriteLine("使用SqlServer查询");
}
}
}
新建一个MyJob方法,这个是定时任务执行的方法
using System;
using System.Threading.Tasks;
using Quartz;
using IMySql; namespace MyQuartz
{
public class MyJob : IJob
{
private readonly IMySqlInterface _mySql; public MyJob(IMySqlInterface mySql)
{
_mySql = mySql;
} public Task Execute(IJobExecutionContext context)
{
_mySql.Query();
Console.WriteLine(DateTime.Now.ToLongTimeString());
return Task.CompletedTask;
}
}
}
新建一个继承IJobFactory接口的类,这个类用于提供默认的任务工厂:
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using Quartz.Spi;
using System; namespace MyQuartz
{
public class MyJobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider; public MyJobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
} public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
} public void ReturnJob(IJob job)
{
var disposable = job as IDisposable;
disposable?.Dispose(); }
}
}
最后是Main方法
using System;
using Microsoft.Extensions.DependencyInjection;
using IMySql;
using MySqlServerTest;
using Quartz;
using Quartz.Impl;
using Quartz.Spi;
using System.Threading.Tasks; namespace MyQuartz
{
class Program
{
static async Task Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<IMySqlInterface, SqlServerHelpr>(); //替换成自定义的任务工厂
services.AddSingleton<IJobFactory, MyJobFactory>();
services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
//任务类也需要注册到容器
services.AddSingleton<MyJob>(); var provider = services.BuildServiceProvider();var _jobFactory = provider.GetService<IJobFactory>();
var _schedulerFactory = provider.GetService<ISchedulerFactory>(); IScheduler scheduler = await _schedulerFactory.GetScheduler();
//关键在于这里,替换掉调度器默认的任务工厂
scheduler.JobFactory = _jobFactory;
await scheduler.Start(); //创建一个MyJob任务,一秒跑一次
IJobDetail myJob = JobBuilder.Create<MyJob>()
.WithIdentity("myJob", "group1")
.Build(); ITrigger myTrigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(1)
.RepeatForever())
.Build(); await scheduler.ScheduleJob(myJob, myTrigger); Console.ReadKey();
}
}
}
要注意的点都用注释说明,简单明了。
最终效果

本文参考了
https://www.cnblogs.com/yanglang/p/12071336.html
https://www.cnblogs.com/dayang12525/p/13083026.html
在Quartz .NET的工作类中使用依赖注入的更多相关文章
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- 类比Spring框架来实现OC中的依赖注入
如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Co ...
- ABP中的依赖注入思想
在充分理解整个ABP系统架构之前首先必须充分了解ABP中最重要的依赖注入思想,在后面会具体举出一些实例来帮助你充分了解ABP中的依赖注入思想,在了解这个之前我们首先来看看什么是依赖注入?来看看维基百科 ...
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- ASP.NET Core 中的依赖注入
目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...
- Android 和 Dagger 2 中的依赖注入
原文:Dependency Injection in Android with Dagger 2 作者:Joe Howard 译者:kmyhy 在现代开发团队中到处充斥着"你一定要用依赖注入 ...
- SignalR中的依赖注入
什么是依赖注入? 如果你已经熟悉依赖注入可以跳过此节. 依赖注入 (DI) 模式下,对象并不为自身的依赖负责. 下边的例子是一个主动 DI. 假设你有个对象需要消息日志.你可能定义了一个日志接口: C ...
随机推荐
- F450 APM2.8 自组无人机手记
由于是初次接触无人机,外加自组需要焊接,做了一些前期的心理建设.但是过程还是异常艰难.(不过,实际操作也就焊20个焊点左右,基本就组装起来了,操作并不复杂) 自组APM无人机是想学习Ardupilot ...
- 鱼香ROS一键安装软件
一行代码-解决人生烦恼 推荐语:一行代码搭建机器人开发环境(ROS/ROS2/ROSDEP) 开源地址:https://github.com/fishros/install 一键安装指令 wget h ...
- pytest的conftest.py文件讲解
一.conftest.py的特点 1.可以跨.py文件调用,有多个.py文件调用时,可让conftest.py只调用了一次fixture,或调用多次fixture 2.conftest.py与运行的用 ...
- 深度解读RDS for MySQL 审计日志功能和原理
本文分享自华为云社区<[华为云MySQL技术专栏]RDS for MySQL 审计日志功能介绍>,作者:GaussDB数据库. 1. 背景 在生产环境中,当数据库出现故障或问题时,运维人员 ...
- 模态内重叠优化,简单有效的CLIP微调方法 | BMVC'24 Oral
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: CLIP Adaptation by Intra-modal Overlap Reduction 论文地址:https://arxiv.org ...
- 6、oracle网络(监听)
oracle包含 1.软件 2.数据库 3.实例 4.监听(listener) 监听的特点 可以独立启动,就是说,数据库没有启动,监听可以启动:数据库启动,监听也可以不启动:数据库启动,监听也启动 监 ...
- rustlings v6.0 运行时出现 “ You are trying to run Rustlings using the old method before version 6”
背景 在之前学习 rust 时,使用过一段时间 rustlings 感觉还不错,但是之前的学习只把 rustlings 的题目刷了一半,然后想再从头到尾刷一遍 rustlings 的题目. 在 rus ...
- golang之路由库gorilla/mux
gorilla/mux是 gorilla Web 开发工具包中的路由管理库.gorilla Web 开发包是 Go 语言中辅助开发 Web 服务器的工具包.它包括 Web 服务器开发的各个方面, 有表 ...
- 【3分钟学会】一招禁用表单中input输入框回车键自动触发提交事件!
知其然知其所以然 在前端项目开发中,偶尔会有表单提交的问题: 用户输入表单后,不小心按了回车键,导致提前触发了提交事件? 问题概述 当表单中仅有一个input输入框时,按下回车键就会自动触发提交事件, ...
- YashanDB演讲实录|别彬彬:金融科技对智能化创新系统的机遇与路径
本文为"2024国产数据库创新生态大会"深算院采石矶.钓鱼城系统技术总监别彬彬的演讲实录分享,主题为 <金融科技对智能化创新系统的机遇与路径>,欢迎阅读. 各位领导.嘉 ...