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的工作类中使用依赖注入的更多相关文章

  1. 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, ...

  2. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  3. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  4. 类比Spring框架来实现OC中的依赖注入

    如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Co ...

  5. ABP中的依赖注入思想

    在充分理解整个ABP系统架构之前首先必须充分了解ABP中最重要的依赖注入思想,在后面会具体举出一些实例来帮助你充分了解ABP中的依赖注入思想,在了解这个之前我们首先来看看什么是依赖注入?来看看维基百科 ...

  6. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  7. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  8. ASP.NET Core 中的依赖注入

    目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...

  9. Android 和 Dagger 2 中的依赖注入

    原文:Dependency Injection in Android with Dagger 2 作者:Joe Howard 译者:kmyhy 在现代开发团队中到处充斥着"你一定要用依赖注入 ...

  10. SignalR中的依赖注入

    什么是依赖注入? 如果你已经熟悉依赖注入可以跳过此节. 依赖注入 (DI) 模式下,对象并不为自身的依赖负责. 下边的例子是一个主动 DI. 假设你有个对象需要消息日志.你可能定义了一个日志接口: C ...

随机推荐

  1. 智子: Vue Vapor年底发布alpha版本,如果有资金支持

    前言 在最近的Vue Fes大会上,Vue Vapor的作者智子大佬宣布,如果能够得到资金支持,那么Vue Vapor年底就能发布alpha版本了. 关注公众号:[前端欧阳],给自己一个进阶vue的机 ...

  2. 号码变换配置对接运营商IMS

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. fs直接对接运营商,调试过程中的号码变换规则比较容易出问题. 本文档记录一个较为通用的对接IMS配置方案. 环境 CentOS 7. ...

  3. CF939 D

    CF939 D 让你把区间分成 \(k\) 段, 段内用 \(xor\) 连接, 段之间用 \(or\) 连接,问你在结果不大于 \(x\) 的前提下, \(k\) 的最大值 \(1 \leq n \ ...

  4. PhpStorm 中切换PHP8以上报错 VCRUNTIME140.dll 与PHP 版本不兼容

    错误原因:PhpStorm 附带了旧版本或错误版本的vcruntime140.dll 解决方法: 打开PhpStorm VCRUNTIME140 存在目录  C:\Program Files\JetB ...

  5. AtCoder Beginner Contest 380 (A~E)题解

    A - 123233 遍历字符串统计出现次数即可. #include<bits/stdc++.h> using namespace std; #define int long long c ...

  6. Android之JNI开发

    JNIJNI是Java Native Interface的缩写,俗称Java本地接口,是Java语言提供的用于Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的 ...

  7. 2023-05 多校联合训练 ZJNU站 热身赛

    猫猫接币币 给定两个容量分别为a和b的盒子,已知第i秒天上会掉下i个金币,你会从第1秒开始接金币,每秒钟你可以选择任意一个盒子接金币,但是不能不选,你必须使得两个盒子刚好装满,请问是否存在某个时刻,使 ...

  8. docker 下载镜像配置

    现在docker 安装镜像的时候,会发现下载不了镜像. 有网友提供了一些可用的镜像,亲测可用. { "registry-mirrors": [ "https://dock ...

  9. postgres 在centos 安装

    执行如下命令安装POSTGRES sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86 ...

  10. MySQL中INSERT INTO ... ON DUPLICATE KEY UPDATE浅析

    最近在做一个阅读次数的需求的时候,有这样一个场景,如果数据库中没有数据,就进行INSERT操作,有数据的话,阅读次数就+1.此处有两种实现方式,一种是想将数据查出来,在Java中进行处理,没有就INS ...