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源码分析系列文章目录
#1楼 2016-05-16 21:20 angtianqiang
楼主你这个UML图是VS里生成的么?
支持(0) 反对(0)
#2楼 [楼主] 2016-05-16 21:49 ZHK的博客
@ angtianqiang
是的
支持(0) 反对(0)
#3楼 2016-05-19 21:11 蓝色梦想
楼主,请教一上,注册EventBus到Ioc容器的两种方式有什么区别?
我的理解是一种是通过静态对象注册,一种通过实例对象注册,但注册到Ioc容器后都是通过单例访问的。为什么要区分开来呢?
支持(0) 反对(0)
#4楼 [楼主] 2016-05-20 22:15 ZHK的博客
@ 蓝色梦想
不一样,前一个通过FactoryMethod生成实例,后一个通过Ioc容器生成实例。注意留意EventBus类中的Logger属性,通过前一种方式生成的实例的Logger属性是NullLogger。而通过后一种通过Ioc容器生成实例的Logger属性则是注册到Ioc容器中的Logger实例。
支持(1) 反对(0)
#5楼 2016-05-28 09:22 无根,所以只能随风飘荡
能否把消息登记到第三方消息中间件?
支持(0) 反对(0)
#6楼 [楼主] 2016-05-28 17:45 ZHK的博客
@ 无根,所以只能随风飘荡
可以通过实现IEventBus等接口,创建支持第三方消息中间件的Module。
支持(0) 反对(0)
#7楼 2016-05-30 18:45 海~~D
楼主,我注意到它的事件处理工厂IEventHandlerFactory有两个实现,分别是SingleInstanceHandlerFactory和TransientEventHandlerFactory。
SingleInstanceHandlerFactory单例模式的ReleaseHandler为空,说明它不需要去释放。
TransientEventHandlerFactory它的ReleaseHandler会释放所有实现IDisposable的IEventHandler。
我想问的是EventBus的Register方法会返回IDisposable接口,它是FactoryUnregistrar对象,它定义了Dispose方法会Unregister解除绑定。
但我始终没有找到地方,会调用这个Dispose方法,还请楼主解惑!
支持(0) 反对(0)
#8楼 [楼主] 2016-05-30 20:31 ZHK的博客
@ 海~~D
这个Dispose方法要你去调用的。测试项目中有用例的。
支持(0) 反对(0)
#9楼 2016-05-30 22:12 海~~D
@ ZHK的博客
是不是说,一般情况下,不需要手动调用,只有在特殊的场景和需求时,才需要手动调用?
支持(0) 反对(0)
#10楼 [楼主] 2016-05-30 22:57 ZHK的博客
@ 海~~D
这样回答你的问题,如何使用看业务场景喽:
EventBus的Register一个IEventHandlerFactory,而Dispose方法则是Unregister一个IEventHandlerFactory。