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