Abp Vnext源码解析系列文章01---EventBus
一、简介
BP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅。第二种则是分布式事件总线,ABP vNext 自己封装了一个抽象层进行定义,并使用 RabbitMQ编写了一个基本实现。
在使用方式上,两种事件总线的作用基本相同。
事件总线分布在两个模块,在 Volo.Abp.EventBus 模块内部,定义了事件总线的抽象接口,以及本地事件总线 (ILocalEventBus) 的实现。分布式事件总线的具体实现,是在 Volo.Abp.EventBus.RabbitMQ 模块内部进行定义,从项目名称可以看出来,这个模块是基于 RabbitMQ 消息队列实现的。
二、源码分析
1、注册事件处理器
首先从一个项目的模块开始,Volo.Abp.EventBus 库的模块 AbpEventBusModule 只干了一件事情。在组件注册的时候,根据组件的实现接口 (ILocalEventHandler 或 IDistributedEventHandler) 不同,将其赋值给 AbpLocalEventBusOptions 与 AbpDistributedEventBusOptions 的 Handlers 属性。
也就是说,开发人员定义的事件处理程序 (Handler) 都会在依赖注入的时候,都会将其类型 (Type) 添加到事件总线的配置类当中,方便后续进行使用。

2、发布事件
项目中调用发布事件:
1)类中注入
private readonly ILocalEventBus _localEventBus;
2)方法中调用
await _localEventBus.PublishAsync(eto);
可见,是调用接口ILocalEventBus的实现类中的PublishAsync方法
现在进入ILocalEventBus接口看看
3、ILocalEventBus接口

该接口中并没有PublishAsync方法,可见在其基接口IEventBus中
进入IEventBus接口中找到了PublishAsync方法定义

该接口的实现在EventBusBase中,进入PublishAsync方法后又调用了PublishToEventBusAsync方法,该方法为一个抽像方法,肯定在他的子类中会去实现这个方法

我们先看本地事件总线中是如何实现PublishToEventBusAsync这个方法的
4、LocalEventBus中查看PublishToEventBusAsync方法的重写

在此方法中最后会去调用TriggerHandlersAsync方法,而此方法是来自于父类EventBusBase
可以看到真正的触发行为是在 TriggerHandlersAsync 内部进行实现的。


在TriggerHandlersAsync 方法中,前面一段的两个foreach循环中第一个foreach是获取所有事件处理器的工厂,第二个foreach是为了获取所有所有的处理器,并执行TriggerHandlerAsync方法,并最终执行我们自己定义处理器的HandleEventAsync方法
后面一段if语句中的代码主要做的事件是发布一个父类事件
5、让我们来看看真正事件处理器的执行是走的哪个方法吧

参考文摘:
(18条消息) [Abp vNext 源码分析] - 13. 本地事件总线与分布式事件总线 (Rabbit MQ)_风神修罗使的博客-CSDN博客_分布式事件总线
Abp Vnext源码解析系列文章01---EventBus的更多相关文章
- SpringBoot源码解析系列文章汇总
		
相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的SpringBoot源码解析系列文章的汇总,当你使用SpringBoot不仅仅满足于基本使用时.或者出去面试被面试官虐了时.或者说想要深入了解一下 ...
 - TiKV 源码解析系列文章(三)Prometheus(上)
		
本文为 TiKV 源码解析系列的第三篇,继续为大家介绍 TiKV 依赖的周边库 rust-prometheus,本篇主要介绍基础知识以及最基本的几个指标的内部工作机制,下篇会介绍一些高级功能的实现原理 ...
 - Eureka源码解析系列文章汇总
		
先看一张图 0 这个图是Eureka官方提供的架构图,整张图基本上把整个Eureka的核心功能给列出来了,当你要阅读Eureka的源码时可以参考着这个图和下方这些文章 EurekaServer Eur ...
 - tensorflow源码解析系列文章索引
		
文章索引 framework解析 resource allocator tensor op node kernel graph device function shape_inference 拾遗 c ...
 - Android源码解析系列
		
转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...
 - Spring源码解析系列汇总
		
相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题.喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源 ...
 - [Abp vNext 源码分析] - 文章目录
		
一.简要介绍 ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 2 月 18 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.16.0 ,但还属于预览版 ...
 - [Abp vNext 源码分析] - 2. 模块系统的变化
		
一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...
 - MyBatis 源码分析系列文章合集
		
1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...
 
随机推荐
- MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题
			
我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...
 - C#委托、多播委托极简案例,一看就懂
			
废话不多讲,直接上代码,看完代码再讲解: class Class1 { public delegate void Del();//声明委托 public static void F1() { Cons ...
 - AS之去掉顶部标题栏
			
在该目录下,将原本<style name的这行代码改为: <style name="Theme.Tongxunlu" parent="Theme.Materi ...
 - java中如何能知道应该捕获什么样的异常?举例
			
我怎么知道应该捕获什么样的异常? 马克-to-win:如上例1.1:开始没加try时,程序崩溃,系统打印的是如下的错误,Exception in thread "main" jav ...
 - ubantu系统之 虚拟机不识别usb接口
			
1. 下载和 virtualbox 同一版本的 Orcale VM VirtualBox Extension Pack 并在ubantu上安装:2. 启动虚拟机,选中菜单栏中"设置" ...
 - JavaScript 中 empty、remove 和 detach的区别
			
内容 empty.remove 和 detach的区别 jQuery 操作 DOM 之删除节点 方法名 元素所绑定的事件及数据是否也被移除 作用 $(selector).empty() 是 从被选元素 ...
 - Pascal的旅行
			
[问题描述] 一块的nxn游戏板上填充着整数,每个方格上为一个非负整数.目标是沿着从左上角到右下角的任何合法路径行进,方格中的整数决定离开该位置的距离有多大,所有步骤必须向右或向下.请注意,0是一个死 ...
 - 简简单单用一下 Hbase
			
一.Hbase 介绍 https://hbase.apache.org/book.html#_preface https://blogs.apache.org/hbase/ https://resea ...
 - linux磁盘之lsblk命令
			
lsblk命令可以显示很多跟磁盘相关分区.所属关系以及lvm的重要信息,所以这个命令最好掌握.lsblk命令默认情况下将以树状列出所有块设备,包括查看磁盘挂载信息.lsblk命令包含在util-lin ...
 - 性能优化之html、css、js三者的加载顺序
			
前言 我们知道一个页面通常由,html,css,js三部分组成,一般我们会把css文件放在head头部加载,而js文件则放在页面的最底部加载,想要知道为什么大家都会不约而同的按照这个标准进行构建页面, ...