ABP源码分析二十五:EventBus
IEventData/EventData: 封装了EventData信息,触发event的源对象和时间
IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法。EventBus定义了一个Dictionary容器来存放事件和处理该事件的对象(其实不是对象而是Factory,暂且这样理解无妨)。其key是Type:在ABP使用Type表示不同的事件,具体而言这个type是EventData派生类的类型。EventData在ABP中有两个作用:第一用于封装事件数据,第二,就是使用其本身CLR类型信息来代表不同的事件。Dictionary容器的value是List<IEventHandlerFactory>而不是直接存放处理该事件的对象,首先这是个集合,也就是是说一个事件可以有多个事件处理函数, 第二,IEventHandlerFactory是什么?后文有解释,简单理解就是一个工厂,根据其封装事件处理函数的类型生成实例
EventBusInstaller:实现了IWindsorInstaller接口。第一,Register IEventBus和EventBus到依赖注入框架中,并且resolve IEventBus以得到EventBus的实例。第二,将所有实现了IEventHandler<in TEventData>的类都会添加到Eventbus的_handlerFactories这个集合中。通过EventBusInstaller是一种添加事件处理对象到EventBus的方式。 另一种方式是直接通过EventBus的register方法。
EntityEventData:定义了一个以entity为参数的构造函数,用以将entity实例作为EventData的一部分。
以下这些派生自EntityEventData的类都是空的派生类(既没有重写父类中的方法,也没有自定义新的成员或方法。)。这些类只起到标注的作用,也就是通过类的名字来区分不同的事件。本质上来说,EventBus是通过EventData的派生类的类型来区分不同事件类型的,因为其用于存放事件处理函数的_handlerFactories是一个以EventData派生类的类型为key的Dictionary容器。
EntityChangedEventData,EntityChangingEventData,EntityCreatedEventData,EntityCreatingEventData,EntityDeletedEventData,EntityDeletingEventData,EntityUpdatedEventData,EntityUpdatingEventData:都用于存放事件数据,但更重要的是他们通过其自生的类型表示不同的事件类型。
IEntityChangeEventHelper/EntityChangeEventHelper:用于触发entity change(create,delete, update)相关的事件.
Abp中只有两处引用了IEntityChangeEventHelper,分别是AbpDbContext和AbpNHibernateInterceptor。在save方法的时候会通过IEntityChangeEventHelper实例触发相应的事件。
ExceptionData:用以标识这个事件用于处理Exception的
AbpHandledExceptionData:用以标识这个事件处理Exception的,并且这个事件有ABP底层框架来处理。笔者在Abp框架中没有发现有处理这种事件的事件处理对象。
IEventHandler/IEventHandler<in TEventData>: 所有事件处理器EventHandler的接口,定义了HandleEvent方法。我们可以实现IEventHandler<in TEventData>接口,以实现自定义的事件处理器。比如下面的例子就定义了一个处理AbpHandledExceptionData事件的事件处理器:
ActionEventHandler:内部类,起到适配器的作用,将一个Action适配成一个事件处理器EventHandler。
IEventHandlerFactory:事件处理器EventHandler的工厂接口,用于创建,获取和注销事件处理器EventHandler。
SingleInstanceHandlerFactory:用于创建单例EventHandler的工厂。
TransientEventHandlerFactory:该工厂每次都会创建一个新的EventHandler的实例。
IocHandlerFactory:通过容器生成EventHandler的实例。在Eventbus这个模块在被初始化的时候,所有实现了IEventHandler<in TEventData>的类都会被注册到Eventbus的_handlerFactories这个集合中。
FactoryUnregistrar:实现了IDisposable接口,用于注销factory.
IEventDataWithInheritableGenericArgument:如果你的evendata继承了这个接口。就可以按照继承层次往上逐个触发事件。下面是个例子,来自代码中的注释
For example;
Assume that Student inherits From Person. When trigger an EntityCreatedEventData{Student}, EntityCreatedEventData{Person} is also triggered if EntityCreatedEventData implements
this interface.
ABP源码分析二十五:EventBus的更多相关文章
- ABP源码分析二十:ApplicationService
IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...
- ABP源码分析二十二:Navigation
MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
- ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...
- ABP源码分析二十八:ABP.MemoryDB
这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...
- ABP源码分析二十九:ABP.MongoDb
这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...
- ABP源码分析三十五:ABP中动态WebAPI原理解析
动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...
- ABP源码分析四十五:ABP ZERO中的EntityFramework模块
AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...
- Vue.js 源码分析(二十五) 高级应用 插槽 详解
我们定义一个组件的时候,可以在组件的某个节点内预留一个位置,当父组件调用该组件的时候可以指定该位置具体的内容,这就是插槽的用法,子组件模板可以通过slot标签(插槽)规定对应的内容放置在哪里,比如: ...
随机推荐
- HTTP协议系列(1)
一.为什么学习Http协议 首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...
- Code Review 程序员的寄望与哀伤
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
- ASP.NET路由模型解析
大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...
- 网站定位之---根据IP获得区域
记得以前做一个培训机构网站时候需要定位,那时候用的搜狐的api,不是很精准. demo:https://github.com/dunitian/LoTCodeBase/tree/master/NetC ...
- dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...
- 深入解析Sqlite的完美替代者,android数据库新王者——Realm
写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...
- 微信小程序初探
做为码农相信大家最近肯定都会听到微信小程序,虽然现阶段还没有正式开放注册,但大家可以还是可以开发测试. 到微信的WIKI(http://mp.weixin.qq.com/wiki?t=resource ...
- animate.css(第三方动画使用方法)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #a5b2b9 } animation 语法: animatio ...
- Win10连接远程桌面时提示“您的凭据不工作”
我遇到这个问题的时候查找网上都给出一堆高大上的解决办法, 然而我的错误实际上是用户名的问题, 很多人以为远程用户名就一定是锁屏状态下的登录名, 其实不是,跟自己设置有关,所以首先应该检查远程用户名是否 ...
- BRDF 光照模型
http://blog.csdn.net/liu_lin_xm/article/details/4846144