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源码分析系列文章目录

ABP源码分析二十五:EventBus相关推荐

  1. 【转】ABP源码分析二十五:EventBus

    IEventData/EventData: 封装了EventData信息,触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法. ...

  2. 【转】ABP源码分析二十九:ABP.MongoDb

    这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...

  3. 【转】ABP源码分析四十五:ABP ZERO中的EntityFramework模块

    AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...

  4. 【转】ABP源码分析三十五:ABP中动态WebAPI原理解析

    动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...

  5. 【转】ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用(该模块用于支持ABP框架单元测试的).一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能 ...

  6. 【转】ABP源码分析二十六:核心框架中的一些其他功能

    本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...

  7. 【转】ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

  8. 【转】ABP源码分析二十二:Navigation

    MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...

  9. 【转】ABP源码分析二十:ApplicationService

    IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...

最新文章

  1. RandomAccessFile学习笔记
  2. java 数据结构源码--Trie树
  3. php有个qrcode类,一个PHP的QRcode类与大家分享
  4. 使用CXF 2.7.5出现的java.lang.RuntimeException: Cannot create a secure XMLInputFactory错误解决...
  5. 互联网寒冬!“996”为什么还没实行?我还等着早点下班呢!
  6. 无线路由与无线AP有什么不同
  7. 电路板上的插头怎么拔下来_空调维修排查电路板内外原因
  8. 置顶图片代码加链接html,css图片怎么加链接?
  9. Android实现点击两次返回键退出
  10. Ripro子主题-ziyuan-zhankr资源主题 蓝色简约版
  11. python中文文本分析_中文文本处理
  12. (转载)网络互联参考模型(详解)
  13. Python入门教程!手把手教会你爬取网页数据
  14. MethodArgumentNotValidException异常拦截提示信息太长?
  15. 用驱动精灵和手动更新方式安装 Arduino mega 2560 驱动失败的解决方案
  16. HOW UNREAL RENDERS A FRAME
  17. PS动作快速把图片做成手绘油漆涂鸦画效果
  18. 计算机网络应用大专,计算机网络应用专业
  19. 大话数据结构笔记-图
  20. 长期坚持早起后,有哪些惊人的变化?

热门文章

  1. mongodb备份和恢复:mongodump/mongorestore ( 二)
  2. 广州运营开放式数据交易平台发力大数据业务
  3. Redis高级特性介绍及实例分析
  4. 用babel cli编译用ES6写的JSX
  5. 正确设置asp.net网站的404错误页面
  6. CommunityServer 的对象持久化
  7. Leetcode-MySQL-197. 上升的温度
  8. React 第九章 表单的使用
  9. spark的TimSort排序算法实现
  10. Java定时任务调度工具详解之Timer篇