一、官方描述

These projects simplify the integration between Hangfire and your favorite IoC Container. They provide custom implementation of JobActivator class as well as registration extensions that allow you to use unit of work pattern or deterministic disposal in your background jobs.

根据上述说明可以简单理解为继承“JobActivator”来实现自定义IOC容器。

二、JobActivator


//抽象Job生命周期
public abstract class JobActivatorScope : IDisposable
{....省略//定义抽象方法,获取实例public abstract object Resolve(Type type);//定义虚方法,摧毁生命周期public virtual void DisposeScope(){}}public class JobActivator
{....省略//定义虚方法,默认使用反射获取实例public virtual object ActivateJob(Type jobType){return Activator.CreateInstance(jobType);}//定义虚方法,创建一个生命周期[Obsolete("Please implement/use the BeginScope(JobActivatorContext) method instead. Will be removed in 2.0.0.")]public virtual JobActivatorScope BeginScope(){return new SimpleJobActivatorScope(this);}//定义虚方法,创建一个生命周期public virtual JobActivatorScope BeginScope(JobActivatorContext context){
#pragma warning disable 618return BeginScope();
#pragma warning restore 618}//实现简单的生命周期class SimpleJobActivatorScope : JobActivatorScope{private readonly JobActivator _activator;//存储所有需要回收的实例private readonly List<IDisposable> _disposables = new List<IDisposable>();public SimpleJobActivatorScope([NotNull] JobActivator activator){if (activator == null) throw new ArgumentNullException(nameof(activator));_activator = activator;}public override object Resolve(Type type){var instance = _activator.ActivateJob(type);var disposable = instance as IDisposable;if (disposable != null){_disposables.Add(disposable);}return instance;}public override void DisposeScope(){foreach (var disposable in _disposables){disposable.Dispose();}}}
}

三、.Net Core 原生DI作为IOC容器

Hangfire.AspNetCore源码实现

public class AspNetCoreJobActivator : JobActivator
{private readonly IServiceScopeFactory _serviceScopeFactory;....省略public override JobActivatorScope BeginScope(JobActivatorContext context){return new AspNetCoreJobActivatorScope(_serviceScopeFactory.CreateScope());}#pragma warning disable CS0672 // Member overrides obsolete memberpublic override JobActivatorScope BeginScope()
#pragma warning restore CS0672 // Member overrides obsolete member{return new AspNetCoreJobActivatorScope(_serviceScopeFactory.CreateScope());}
}internal class AspNetCoreJobActivatorScope : JobActivatorScope
{private readonly IServiceScope _serviceScope;....省略public override object Resolve(Type type){//注意:AspNetCore是获取或者创建,意味着实例没有注入也会创建一个新的实例return ActivatorUtilities.GetServiceOrCreateInstance(_serviceScope.ServiceProvider, type);}public override void DisposeScope(){_serviceScope.Dispose();}
}

四、Autofac 作为IOC容器

Hangfire.Autofac源码实现

/// <summary>
/// Hangfire Job Activator based on Autofac IoC Container.
/// </summary>
public class AutofacJobActivator : JobActivator
{/// <summary>/// Tag used in setting up per-job lifetime scope registrations./// </summary>public static readonly object LifetimeScopeTag = "BackgroundJobScope";private readonly ILifetimeScope _lifetimeScope;private readonly bool _useTaggedLifetimeScope;....省略//重写public override object ActivateJob(Type jobType){return _lifetimeScope.Resolve(jobType);}#if NET45//重写public override JobActivatorScope BeginScope(){return new AutofacScope(_useTaggedLifetimeScope? _lifetimeScope.BeginLifetimeScope(LifetimeScopeTag): _lifetimeScope.BeginLifetimeScope());}
#else//重写public override JobActivatorScope BeginScope(JobActivatorContext context){return new AutofacScope(_useTaggedLifetimeScope? _lifetimeScope.BeginLifetimeScope(LifetimeScopeTag): _lifetimeScope.BeginLifetimeScope());}
#endifclass AutofacScope : JobActivatorScope{private readonly ILifetimeScope _lifetimeScope;....省略//重写public override object Resolve(Type type){return _lifetimeScope.Resolve(type);}//重写public override void DisposeScope(){_lifetimeScope.Dispose();}}
}

五、使用

在Hangfire源码“CoreBackgroundJobPerformer”类中使用:

//执行任务
public object Perform(PerformContext context)
{//创建一个生命周期using (var scope = _activator.BeginScope(new JobActivatorContext(context.Connection, context.BackgroundJob, context.CancellationToken))){object instance = null;....省略//任务是否为静态方法,若是静态方法需要从IOC容器中取出实例if (!context.BackgroundJob.Job.Method.IsStatic){instance = scope.Resolve(context.BackgroundJob.Job.Type);....省略}....省略}
}

转载于:https://www.cnblogs.com/yrinleung/p/10554322.html

Hangfire源码解析-如何实现可扩展IOC的?相关推荐

  1. 源码解析 - Spring如何实现IoC的?

    点击↑上方↑蓝色"编了个程"关注我~ 每周至少一篇原创文章 这是本公众号的第 28 篇原创文章 荒腔走板 上周一冲动买了个游戏手柄. 小时候很喜欢玩游戏,那个时候手柄游戏还是插卡的 ...

  2. Dubbo的可扩展机制SPI源码解析

    内容概要: Dubbo SPI案例演示 Dubbo SPI主流程源码解析 Dubbo中的依赖注入源码解析 Dubbo中的AOP实现源码解析 Dubbo中的Adaptive机制源码解析 文章目录 一.D ...

  3. Dubbo第三讲:Dubbo的可扩展机制SPI源码解析

    本文是Dubbo第三讲:Dubbo的可扩展机制SPI源码解析 文章目录 1.Dubbo SPI机制 1.1.Dubbo具有良好拓展性的原因 1.2.Dubbo SPI和Java SPI的区别? 1.3 ...

  4. libev源码解析——监视器(watcher)结构和组织形式

    在<libev源码解析--总览>中,我们介绍了libev的一些重要变量在不同编译参数下的定义位置.由于这些变量在多线程下没有同步问题,所以我们将问题简化,所提到的变量都是线程内部独有的,不 ...

  5. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  6. Java集合---LinkedList源码解析

    一.源码解析 1. LinkedList类定义 2.LinkedList数据结构原理 3.私有属性 4.构造方法 5.元素添加add()及原理 6.删除数据remove() 7.数据获取get() 8 ...

  7. 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...

  8. kube-proxy源码解析

    kube-proxy源码解析 ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源 码解析为主,如果想去了解iptables模式的原理,可以去参考其实现,架构上无差别. ku ...

  9. 路由框架ARouter最全源码解析

    ARouter是2017年阿里巴巴开源的一款Android路由框架,官方定义: ARouter是Android平台中对页面,服务提供路由功能的中间件,提倡简单且够用 有下面几个优势: 1.直接解析UR ...

最新文章

  1. Shell脚本编程01:基础知识
  2. 台达伺服控制器接线图_台达驱控一体三轴伺服驱动器ASDA-M-R系列无骨线圈绕线机解决方案...
  3. 常用的cmd快捷命令
  4. python 多线程笔记(6)-- 闭包
  5. 针对Spring的Spring Retry 我发现了这样一个大家都不知道的技巧!
  6. 前端学习(2080):计算属性和methods得对比
  7. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]
  8. spring boot 1.5.4 定时任务和异步调用(十)
  9. python小软件实例教程_【趣味案例】用Python做一个时光回忆录小软件,女朋友当场流泪说非我不嫁!...
  10. 基于Pytorch源码对Adagrad、Adadelta、RMSProp、Adam等自适应学习率进行学习
  11. 2022-2028年全球与中国硬盘驱动器存储模块行业深度分析
  12. 基于matlab的gmsk,基于matlab的gmsk
  13. Android对接蓝牙打印机
  14. 网课答题查询助手(免费)
  15. 动态桌面软件测试简历,动态壁纸软件横评
  16. searchableSelect下拉框插件增加按拼音及首拼搜索
  17. 设计模式——简单工厂模式之女娲造人
  18. css设置兄弟元素样式-兄弟选择器
  19. R: RStudio的中文读取、保存与显示
  20. 2022技术趋势预测,Python、Java占主导,Rust、Go增长迅速,元宇宙成为关注焦点

热门文章

  1. 爱情是一出未经排练的戏
  2. 一些开发点滴[java]
  3. 2016谷歌官方最新eclipse工程导入studio,以前方式全部废弃。不能再使用。
  4. android 检测字符串是否为合法域名
  5. android Math的使用
  6. DOM树-Render树-RenderLayer树 对应关系
  7. C++和Java的属性访问和方法调用 效率比较
  8. 企业内部信息化项目管理之我所见
  9. 浅谈Git的基本工作流程与简单的Git命令
  10. 适用于单片机的数据加密算法:xxtea