theme: channing-cyan

highlight: a11y-dark

背景

最近在做一个需求,就是在Job中捕捉异常,然后通过邮件或者消息的方式推送给指定人员,在需求实现的过程中遇到的一个注入问题,觉得很有意思,特此记录。

如果您看了觉得或者已经有更好的办法,烦请告诉我一下,我们可以共同讨论,如果有地方不对,也请不吝斧正.


遇到的问题

由于不同功能的Job很多,每一个Job中都要实现对发生异常的消息发送,现有的Job是这样的

为了实现这个需求,也为了以后更好的维护,我准备用事件委托的模式去实现,将对异常消息发送的业务逻辑拆出,保证职责单一,思路如下:

  1. 在Job和IJob中间再加一层IExceptionJobHandler接口作为约束.
  2. 接口中定义一个发送异常消息的事件PushException.
  3. 然后每一个Job在异常时去触发这个事件,外部只需要统一订阅一个事件即可.

到目前这一步是可行的可能有人会问为什么要用接口,而不用父类,因为接口的关系没有父类紧密,用接口后续其他地方要用,可以稍加修改就好了 虽然不是很完美的设计,但是还是比较清晰的,但是另外一个问题来了,我如何通过Autofac注入这个Job呢,原来直接继承自Ijob现在加了一层.


问题分析

这个问题花了我整整大约4个小时的时间去找解决方案,研究依赖注入的方式并且在网上搜了好久,但没什么进展,然后重新梳理了一下框架依赖注入的代码,发现是走错路了,注入Job使用的是Autofac.Extras.Quartz来完成的,这下知道方向了.

在WebAPI中使用Quartz需要在AppStart中加入以下代码:

 var builder = new ContainerBuilder();
builder.RegisterModule(new QuartzAutofacFactoryModule
{
ConfigurationProvider = c => schedulerConfig
});

这个QuartzAutofacFactoryModule里面一定有我想知道的东西,就在Github上下载了Autofac.Extras.Quartz的源码,打开一看,果然发现了它的真面目.

这里面就是对Job依赖注入的,但是没有发现对Job的注册和构建,注意箭头标记的,它有一个AutofacJobFactory类,接收一个ILifetimeScope,而它的作用就是用来构建Job为作用域周期生效的服务实例.


解决方案

  1. 上面分析出构建Job服务实例的是一个叫AutofacJobFactory的工厂,那么我们应该由他入手,找到构建服务的代码,我们看到

    • 在调用ResolveJobInstance方法时返回一个IJob,我要思考的问题是如何把我自定义的接口IExceptionJobHandler注入进去,让我们Job实例拥有这个接口中定义事件呢?
  2. 根据上述设计IExceptionJobHandler继承自IJob,那也就是说这里直接可以把Ijob换成IExceptionJobHandler,该如何实现呢?

  3. 我们观察到在AutofacJobFactory构建服务的方法是一个 虚方法 ,所以可以利用 继承 来解决,我们新建一个ExtendAutofacJobFactory来重写它将Ijob换成IExceptionJobHandler

public class ExtendAutofacJobFactory : AutofacJobFactory
{
protected override IJob ResolveJobInstance(ILifetimeScope nestedScope, IJobDetail jobDetail)
{
//验证Job是否派生自IExceptionJobHandler
if (typeof(IExceptionJobHandler).IsAssignableFrom(jobDetail.JobType))
{
IExceptionJobHandler instance = null;
instance = (IExceptionJobHandler)CreateIJob(nestedScope, jobDetail);
//注册事件统一处理入口
instance.PushException += pushExceptionMessageManager.Value.ExceptionJobHandler
return instance;
}
else
{
return base.ResolveJobInstance(nestedScope, jobDetail);
} }
}
  1. 接下来我们需要把重写的构造工厂放入QuartzAutofacFactoryModule中,但是QuartzAutofacFactoryModule也没有提供设置自定义工厂的入口,那只有依然选择 继承 的方式去重写它.

  2. 然后修改QuartzAutofacFactoryModule加载服务时将服务构造工厂换成我们自己扩展的ExtendAutofacJobFactory.

  1. 在AppStart中Autofac注册服务地方将QuartzAutofacFactoryModule改为自定义的ExtendQuartzAutofacFactoryModule,至此完成了自定义注入.
builder.RegisterModule(new ExtendQuartzAutofacFactoryModule
{
ConfigurationProvider = c => schedulerConfig
});

总结

在被人问到面向对象的特征时,99%的人都能回答出来:[封装] [继承] [多态],甚至会对提出问题的人在内心中深深的鄙视,这xx怎么问这种问题,但是经过一段时间开发经验的沉淀和积累之后,发现往往最简单、最基础的知识,才是最最重要的.

<head>
<script defer src="https://use.fontawesome.com/releases/v5.0.13/js/all.js"></script> <script defer src="https://use.fontawesome.com/releases/v5.0.13/js/v4-shims.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css"></head>

Quartz使用AutoFac依赖注入问题小结的更多相关文章

  1. asp.net mvc4 简单使用Autofac依赖注入小结

    1,首先使用 NuGet下载适当的Autofac版本 文件一,Autofac.3.5.2 文件二,Autofac.Mvc4.3.1.0 1,接口类 public interface IReposito ...

  2. 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入

    一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...

  3. 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入

    PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...

  4. Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入

    Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...

  5. ASP.NETCore使用AutoFac依赖注入

    原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...

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

  7. Autofac依赖注入

    简介 Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 .它的实现方式是将常规的.net类当做 组件 处理. ...

  8. Autofac 依赖注入小知识

    Autofac 依赖注入小知识 控制反转/依赖注入 IOC/DI 依赖接口而不依赖于实现,是面向对象的六大设计原则(SOLID)之一.即依赖倒置原则(Dependence Inversion Prin ...

  9. Autofac 依赖注入

    介绍 Autofac是一款IOC框架,很轻量级性能非常高,自动注入很给力. NuGet Autofac:Autofac控制反转容器核心 Autofac.MVC5:提供IDependencyResolv ...

随机推荐

  1. CMU Convex Optimization(凸优化)笔记1--凸集和凸函数

    CMU凸优化笔记--凸集和凸函数 结束了一段时间的学习任务,于是打算做个总结.主要内容都是基于CMU的Ryan Tibshirani开设的Convex Optimization课程做的笔记.这里只摘了 ...

  2. Qt概要

    Qt是面向对象的框架,使用特殊的代码生成扩展以及一些宏.是一个跨平台的C++图形用户界面.它是一款可以轻松的帮我们做界面的软件. Qt是1991年奇趣科技公司(2008 年 6 月被诺基亚收购)开发的 ...

  3. 问题 B: 比大小

    题目描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如123456789123456789要大于-123456 输入 每组测试数据占一行,输入两个不超过1000位的10进制整数a,b 数 ...

  4. Ubuntu系统下《汇编语言》环境配置

    说明 1.系统:Ubuntu codists@pc:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Des ...

  5. vue+node+mongondb实战之路由

    看了一段时间vue的文档,一直没有机会来开发一个真正的vue项目,趁着这几天清闲,整合一下最新的技术,变学变练来开发一个vue的简单博客 有了开发博客的想法之后,谁知道第一步就被拦住了,看了vue的基 ...

  6. python实现模糊操作

    目录: (一)模糊或平滑与滤波的介绍 (二)均值模糊 (1) 原理 (2)代码实现-----均值模糊函数blur() (三)中值模糊------mediaBlur函数 (四)高斯模糊------Gau ...

  7. python实现高斯滤波

    一,定义 核是:3 *3     均值滤波 二,高斯函数 Y方向的方差与X方向的一致.处理后图像看起来更模糊(滤波明显)的话,核要更大. (三)代码实现 (四)核计算 (五)图像产生高斯噪声循环代码实 ...

  8. [spojQTREE5]Query on a tree V

    合理的正解大概是动态点分治,这里给出其实现 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 st ...

  9. cube+FreeRTOS联合开发采坑笔记

    加了看门狗之后不断重启的可能 原因: 任务容量分配不足,在"FreeRTOSConfig.h"的配置中,有个configTOTAL_HEAP_SIZE中将堆大小调到最大.

  10. 5.基于二进制部署kubernetes(k8s)集群

    1 kubernetes组件 1.1 Kubernetes 集群图 官网集群架构图 1.2 组件及功能 1.2.1 控制组件(Control Plane Components) 控制组件对集群做出全局 ...