0
点赞
收藏
分享

微信扫一扫

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​​) 添加到事件总线的配置类当中,方便后续进行使用。

Abp Vnext源码解析系列文章01---EventBus_封装

 

 

2、发布事件

项目中调用发布事件:

1)类中注入

private readonly ILocalEventBus _localEventBus;

2)方法中调用

await _localEventBus.PublishAsync(eto);

可见,是调用接口ILocalEventBus的实现类中的PublishAsync方法

现在进入ILocalEventBus接口看看

3、ILocalEventBus接口

Abp Vnext源码解析系列文章01---EventBus_事件总线_02

 

该接口中并没有PublishAsync方法,可见在其基接口IEventBus中

进入IEventBus接口中找到了PublishAsync方法定义

Abp Vnext源码解析系列文章01---EventBus_事件总线_03

 

 

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

 

Abp Vnext源码解析系列文章01---EventBus_事件总线_04

 

 

 我们先看本地事件总线中是如何实现PublishToEventBusAsync这个方法的

4、LocalEventBus中查看PublishToEventBusAsync方法的重写

 

Abp Vnext源码解析系列文章01---EventBus_封装_05

 

 

 在此方法中最后会去调用TriggerHandlersAsync方法,而此方法是来自于父类EventBusBase

可以看到真正的触发行为是在 ​​TriggerHandlersAsync​​ 内部进行实现的。

Abp Vnext源码解析系列文章01---EventBus_事件总线_06

 

 Abp Vnext源码解析系列文章01---EventBus_事件处理_07

 在​​TriggerHandlersAsync​​ 方法中,前面一段的两个foreach循环中第一个foreach是获取所有事件处理器的工厂,第二个foreach是为了获取所有所有的处理器,并执行TriggerHandlerAsync方法,并最终执行我们自己定义处理器的HandleEventAsync方法

后面一段if语句中的代码主要做的事件是发布一个父类事件

5、让我们来看看真正事件处理器的执行是走的哪个方法吧

Abp Vnext源码解析系列文章01---EventBus_封装_08

 

 

参考文摘:

​​Tutorials/Part 4 | Documentation Center | ABP.IO​​

(18条消息) [Abp vNext 源码分析] - 13. 本地事件总线与分布式事件总线 (Rabbit MQ)_风神修罗使的博客

举报

相关推荐

0 条评论