在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 ...
随机推荐
- C++ mutable与常对象语义详解
摘编自 <Effective C++> 条款三. "成员函数如果是const" 或者 "一个对象是const对象"到底意味什么?有两个流行概念:bi ...
- vue 父子组件之间传值
在vue中父子组件传值是必不可少的,大家必须要学会! 首先父组件向子组件传值: 父组件:比如我们传teacher为index,如果我们传值变量可以使用 : 绑定我们在data中定义的变量. 子组件:为 ...
- 2.9 使用系统光盘修复Linux系统
如果系统错误已经导致单用户模式不能进入了,那么是否需要重新安装Linux 系统?不用着急,为了应对单用户模式也无法修复的错误,Linux 系统提供了 rescue 救援(光盘修复)模式. rescue ...
- J2eefast页面调试状态下自动进入debugger断点
将fastJS.min.js 替换为 fastJs.js 将所使用到的模块的min.js 替换为js文件
- 内网 BitTorrent 下载环境搭建——基于 Transmission
背景 前段时间为公司的产品增加了磁力链.种子下载的能力,测试时发现网上搜到的热门种子,有时好用,有时不好用,不好用主要表现在:没速度.速度慢.速度不稳定.下载一部分后没速度等,严重拖累了测试工作.为此 ...
- MindSpore-2.4版本中的一些新特性
技术背景 在前面的一篇博客中我们介绍了MindSpore-2.4-gpu的安装和其中可能出现的一些问题.这里我们在安装完成之后,可以尝试使用一些MindSpore新版本的特性.那么在安装之后,如果是使 ...
- 内网渗透之frp+proxifier实现socks5反向代理
目录 前言 环境搭建 frp反向代理 proxifier代理工具 前言 内网穿透,代理技术的联系与区别? 我个人感觉在内网渗透的时候它们之间的界限很模糊,其目的都是为了突破内网访问的限制.内网穿透允许 ...
- Echarts 颜色管理
1.Echarts的颜色设计 Echarts的颜色的设置分为两种:色盘和具体颜色 色盘适合做全局设置,因为他里面有多个颜色,通俗的说色盘就是颜色预设值列表,色盘统一使用color属性进行配置. 而具体 ...
- 【Kotlin】协程
1 前言 相较于 C# 中的协程(详见 → [Unity3D]协同程序),Kotlin 中协程更灵活,难度更大. 协程是一种并发设计模式,用于简化异步编程,它允许以顺序化的方式表达异步操作,避 ...
- Java基础面试:关键字与注释
Java 中的关键字 什么是关键字 Java 关键字是 Java 语言中预先定义好的.具有特殊含义的标识符.这些标识符在程序中有固定的用途,不能用作变量名.方法名或类名.Java 中共有 53 个特殊 ...