.NET Core中Quartz.NET的依赖注入
目录
介绍
项目概况
创建配置文件
使用构造函数注入
使用选项模式
结论
介绍
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的依赖注入相关推荐
- .net 调用url接口_.NetCore中Quartz.NET的依赖注入
更多精彩,请点击上方蓝字关注我们!关于上位机体验课你有两种选择↓:4月20日-24日晚20:00-21:30 介绍 Quartz.NET是一个方便的库,允许您通过实现IJob接口来安排重复任务.然而, ...
- .NET Core基于Furion框架实现依赖注入
Author:think Date:2021-12-18 参考文章:12. 依赖注入/控制反转 | Furion (gitee.io) 环境信息 Furion版本:2.20.6 框架模板:Furion ...
- MVC3 中使用Unity实现依赖注入
前言:前段时间一直在研究依赖注入,不过不是在MVC框架中使用,今天突然想到在MVC中使用Unity实现依赖注入,一时慌了,不知道从何下手,接着就是网上不停的找资料,下面我把我找到的资料分享下,也把我的 ...
- ASP.NET Core应用的7种依赖注入方式
ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...
- ASP.NET Core MVC 控制器创建与依赖注入
在我最后一篇关于 ASP.NET Core 释放IDsiposable对象的文章(中文.英文原文)中,Mark Rendle 指出,MVC 控制器在请求结束时也会释放资源.乍一看,此范围内的资源在请求 ...
- 依赖注入有点_12.24 (Core管道amp;中间件amp;依赖注入+琐碎笔记)
emmmm,其实本来想发服务器部署那一篇的笔记的,可奈何折腾了好多天的linux,部署还是有一小丢丢不完美(我还是想完美一些)所以,今天先把core的这篇主线给更新了. NET Core 管道机制( ...
- 在MVC3项目中结合NInject实现依赖注入
解释: 依赖注入:(Dependency Injection),也称之为控制反转. 大致意思就是,让我们的应用程序所依赖的一些外部服务,可以根据需要动态注入,而不是预先在应用程序中明确的约束.这种思想 ...
- Java EE 7中的资源和依赖注入
1.概述 上下文和依赖注入(CDI)是Java EE的一项功能,可帮助融合Java EE 6和更高版本中包含的平台的Web层和事务层. 从技术角度来看,这意味着CDI提供了依赖项注入框架,并且还管理了 ...
- java 单元测试_在springboot中写单元测试解决依赖注入和执行后事务回滚问题
往期文章 「Java并发编程」谈谈Java中的内存模型JMM 面试官:说说你知道多少种线程池拒绝策略 为什么不要在MySQL中使用UTF-8编码方式 前言 很多公司都有写单元测试的硬性要求,在提交代码 ...
最新文章
- 经管资源库项目的总结笔记
- python需要音语基础_英语基础一般,如何才能学习C语言编程和Python
- UIColor之【扩展:#FFFFFF -UIColor】
- 本地调试微信接口方法
- 编程一小时 code.org [六一关注]
- Exchange邮件系统日志查看及管理
- java中线程的生命周期_Java中的线程生命周期– Java中的线程状态
- 【Java程序设计】类与对象的基本概念(上)
- 一、数据库应用系统分析及规划
- 【控制】《最优控制理论与系统》-胡寿松老师-第4章-动态规划
- GreenSock2
- 斯坦福NLP名课带学详解 | CS224n 第1讲 - NLP介绍与词向量初步(NLP通关指南·完结)
- js导出excels表格.XLSX
- 【会议预告】第七届上海国际皮革展览会
- 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'...
- 人工智能会议等级列表
- 各个网站及搜索引擎收录地址大全
- MySQL连接速度太慢_mysql-连接速度非常慢(1秒)
- Ubuntu20.04安装yum
- lammps教程:薄膜渗透模拟(3)--不同孔隙率对过滤效果的影响
热门文章
- android 原生开发 3d地图 下载_arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)...
- oracle视频教程 任务,Oracle基础教程(两位专家手把手教你完成各种常见任务)
- 个人简介页面如何设计?优秀案例给你灵感
- 平面设计师必备素材|中国/国潮风格
- python3.7.4怎么运行_记一次win7在python3.7.4环境启动ride报错解决
- Windows下打开Url 代码封装 C++
- Windows 软件安全---注入安全
- 学习计划Current(2019.4.23)
- RenderMan:渲染技术
- oracle发邮件没有反应,[数据库]Oracle发邮件,权限问题