目录

介绍

项目概况

创建配置文件

使用构造函数注入

使用选项模式

结论


介绍

Quartz.NET是一个方便的库,允许您通过实现IJob接口来安排重复任务。然而,它的局限性在于,默认情况下,它仅支持无参数构造函数,这使得在其内部注入外部服务变得复杂,即,用于实现存储库模式。在本文中,我们将了解如何使用标准.NET Core DI容器解决此问题。

本文中提到的整个项目在以下Github存储库中提供。为了更好地遵循文章中的代码,您可能需要查看它。

项目概况

我们来看看最初的解决方案结构。

项目QuartzDI.Demo.External.DemoService代表了一些我们无法控制的外部依赖。为了简单起见,它的工作非常简单。

项目QuartzDI.Demo是我们的工作项目,包含简单的Quartz.NET作业。

public class DemoJob : IJob
{private const string Url = "https://i.ua";public static IDemoService DemoService { get; set; }public Task Execute(IJobExecutionContext context){DemoService.DoTask(Url);return Task.CompletedTask;}
}

这是以直接的方式设置的:

var props = new NameValueCollection
{{ "quartz.serializer.type", "binary" }
};
var factory = new StdSchedulerFactory(props);
var sched = await factory.GetScheduler();
await sched.Start();
var job = JobBuilder.Create<DemoJob>().WithIdentity("myJob", "group1").Build();
var trigger = TriggerBuilder.Create().WithIdentity("myTrigger", "group1").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
await sched.ScheduleJob(job, trigger);

我们通过作业的static属性提供外部服务

DemoJob.DemoService = new DemoService();

由于该项目是一个控制台应用程序,在本文的课程中,我们必须手动安装所有需要的基础架构,并能够更全面地了解.NET Core实际上为我们带来了什么。

此时,我们的项目正在运行。最重要的是它很简单,很棒。但是,如果我们想把它作为一个小工具,那么我们就会为这种简单性付出代价。但这通常不是生产系统的情况。所以让我们稍微调整一下以使其更灵活。

创建配置文件

其中一个缺点是我们硬编码调用到DemoJob中的URL 。理想情况下,我们希望更改它,并根据我们的环境进行更改。.NET Core附带了appsettings.json机制。

为了开始使用.NET Core配置机制,我们必须安装几个Nuget包:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json

让我们创建一个具有这样名称的文件并在那里提取我们的URL:

{"connection": {"Url": "http://i.ua"}
}

现在我们可以从配置文件中提取我们的值,如下所示:

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", true, true);
var configuration = builder.Build();
var connectionSection = configuration.GetSection("connection");
DemoJob.Url = connectionSection["Url"];

请注意,要实现它,我们必须将Url从常量更改为属性。

public static string Url { get; set; }

使用构造函数注入

通过static属性注入服务对于一个简单的项目来说很好,但是对于一个更大的项目,它可能带来一些缺点:例如可能在没有服务的情况下调用作业,因此失败或在对象运行时期间改变依赖性,这使得更难以推理对象。要解决这些问题,我们应该使用构造函数注入。

虽然纯依赖注入没有任何问题,但是有些人认为你应该在本文中努力实现它,我们将使用Nuget包附带的内置.NET Core DI容器Microsoft.Extensions.DependencyInjection。

现在我们指定我们依赖于构造函数参数的服务:

private readonly IDemoService _demoService;public DemoJob(IDemoService demoService)
{_demoService = demoService;
}

为了调用作业的参数构造函数,Quartz.NET提供了IJobFactory接口。这是我们的实现:

public class DemoJobFactory : IJobFactory
{private readonly IServiceProvider _serviceProvider;public DemoJobFactory(IServiceProvider serviceProvider){_serviceProvider = serviceProvider;}public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler){return _serviceProvider.GetService<DemoJob>();}public void ReturnJob(IJob job){var disposable = job as IDisposable;disposable?.Dispose();}
}

让我们注册我们的依赖项:

var serviceCollection = new ServiceCollection();
serviceCollection.AddScoped<DemoJob>();
serviceCollection.AddScoped<IDemoService, DemoService>();
var serviceProvider = serviceCollection.BuildServiceProvider();

拼图的最后一块是让Quartz.NET使用我们的工厂。IScheduler有属性JobFactory只是为了这件事。

sched.JobFactory = new DemoJobFactory(serviceProvider);

使用选项模式

现在我们可以使用配置选项来实现相同的技巧。同样,我们的例子以Nuget包开始。这一次是Microsoft.Extensions.Options。

让我们为配置选项创建一个强类型定义:

public class DemoJobOptions
{public string Url { get; set; }
}

现在我们按如下方式填充它们:

serviceCollection.AddOptions();
serviceCollection.Configure<DemoJobOptions>(options =>
{options.Url = connectionSection["Url"];
});

并将它们注入构造函数中。不是我们直接注入IOptions<T>,不是options实例。

public DemoJob(IDemoService demoService, IOptions<DemoJobOptions> options)
{_demoService = demoService;_options = options.Value;
}

结论

在本文中,我们已经了解了如何利用.NET Core功能使Quartz.NET的使用更加灵活。

原文地址:https://www.codeproject.com/Articles/1277745/Dependency-Injection-for-Quartz-NET-in-NET-Core

.NET Core中Quartz.NET的依赖注入相关推荐

  1. .net 调用url接口_.NetCore中Quartz.NET的依赖注入

    更多精彩,请点击上方蓝字关注我们!关于上位机体验课你有两种选择↓:4月20日-24日晚20:00-21:30 介绍 Quartz.NET是一个方便的库,允许您通过实现IJob接口来安排重复任务.然而, ...

  2. .NET Core基于Furion框架实现依赖注入

    Author:think Date:2021-12-18 参考文章:12. 依赖注入/控制反转 | Furion (gitee.io) 环境信息 Furion版本:2.20.6 框架模板:Furion ...

  3. MVC3 中使用Unity实现依赖注入

    前言:前段时间一直在研究依赖注入,不过不是在MVC框架中使用,今天突然想到在MVC中使用Unity实现依赖注入,一时慌了,不知道从何下手,接着就是网上不停的找资料,下面我把我找到的资料分享下,也把我的 ...

  4. ASP.NET Core应用的7种依赖注入方式

    ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...

  5. ASP.NET Core MVC 控制器创建与依赖注入

    在我最后一篇关于 ASP.NET Core 释放IDsiposable对象的文章(中文.英文原文)中,Mark Rendle 指出,MVC 控制器在请求结束时也会释放资源.乍一看,此范围内的资源在请求 ...

  6. 依赖注入有点_12.24 (Core管道amp;中间件amp;依赖注入+琐碎笔记)

    ​emmmm,其实本来想发服务器部署那一篇的笔记的,可奈何折腾了好多天的linux,部署还是有一小丢丢不完美(我还是想完美一些)所以,今天先把core的这篇主线给更新了. NET Core 管道机制( ...

  7. 在MVC3项目中结合NInject实现依赖注入

    解释: 依赖注入:(Dependency Injection),也称之为控制反转. 大致意思就是,让我们的应用程序所依赖的一些外部服务,可以根据需要动态注入,而不是预先在应用程序中明确的约束.这种思想 ...

  8. Java EE 7中的资源和依赖注入

    1.概述 上下文和依赖注入(CDI)是Java EE的一项功能,可帮助融合Java EE 6和更高版本中包含的平台的Web层和事务层. 从技术角度来看,这意味着CDI提供了依赖项注入框架,并且还管理了 ...

  9. java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题

    往期文章 「Java并发编程」谈谈Java中的内存模型JMM 面试官:说说你知道多少种线程池拒绝策略 为什么不要在MySQL中使用UTF-8编码方式 前言 很多公司都有写单元测试的硬性要求,在提交代码 ...

最新文章

  1. 经管资源库项目的总结笔记
  2. python需要音语基础_英语基础一般,如何才能学习C语言编程和Python
  3. UIColor之【扩展:#FFFFFF -UIColor】
  4. 本地调试微信接口方法
  5. 编程一小时 code.org [六一关注]
  6. Exchange邮件系统日志查看及管理
  7. java中线程的生命周期_Java中的线程生命周期– Java中的线程状态
  8. 【Java程序设计】类与对象的基本概念(上)
  9. 一、数据库应用系统分析及规划
  10. 【控制】《最优控制理论与系统》-胡寿松老师-第4章-动态规划
  11. GreenSock2
  12. 斯坦福NLP名课带学详解 | CS224n 第1讲 - NLP介绍与词向量初步(NLP通关指南·完结)
  13. js导出excels表格.XLSX
  14. 【会议预告】第七届上海国际皮革展览会
  15. 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'...
  16. 人工智能会议等级列表
  17. 各个网站及搜索引擎收录地址大全
  18. MySQL连接速度太慢_mysql-连接速度非常慢(1秒)
  19. Ubuntu20.04安装yum
  20. lammps教程:薄膜渗透模拟(3)--不同孔隙率对过滤效果的影响

热门文章

  1. android 原生开发 3d地图 下载_arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)...
  2. oracle视频教程 任务,Oracle基础教程(两位专家手把手教你完成各种常见任务)
  3. 个人简介页面如何设计?优秀案例给你灵感
  4. 平面设计师必备素材|中国/国潮风格
  5. python3.7.4怎么运行_记一次win7在python3.7.4环境启动ride报错解决
  6. Windows下打开Url 代码封装 C++
  7. Windows 软件安全---注入安全
  8. 学习计划Current(2019.4.23)
  9. RenderMan:渲染技术
  10. oracle发邮件没有反应,[数据库]Oracle发邮件,权限问题