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博客_分布式事件总线

Tags: