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

 

 

#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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法...

在之前的例子里&#xff0c;由于Atlas客户端在调用Web Services方法时总是使用了Sys.Net.ServiceMethod类&#xff0c;因此始终使用了HTTP POST方法与服务器端进行交互。POST方法有其好处&#xff0c;不过GET方法也自有其价值。我们在使用Atlas进行Web Services调用时&#xff…

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

本文是ABP核心项目源码分析的最后一篇&#xff0c;介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系。当然可以自定义的去实现IAbpSession使之与CLR的Session关联 IAbpSession&#xff1a;定义如下图中的四个属性。 NullAbpSessio…

CASE 语句

--简单case函数 USE pubsGOSELECT Category CASE type WHEN popular_comp THEN 计算机类 WHEN mod_cook THEN 现代厨艺 WHEN business THEN 商业图书 WHEN psychology THEN 心理学 WHEN trad_cook THEN 传统厨艺 ELS…

【转】ABP源码分析二十七:ABP.Entity Framework

IRepository&#xff1a;接口定义了Repository常见的方法 AbpRepositoryBase&#xff1a;实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepositoryBase中定义的抽象方法&#xff1a;GetAll&#xff0c;Insert&#xff0c;Delete&#xff0c;Update。在实际项目…

泛型实现List(ListT)排序

代码 publicclassPost : IComparable<Post>{ privatestringid string.Empty; privatestringtitle string.Empty; privateintorderby; publicstringID { get{ returnid; } set{ id value; } } pu…

华为鸿蒙与佳华,华为鸿蒙系统发布,带来三大好消息

华为在6月2日举办鸿蒙产品发布会&#xff0c;正式推出搭载鸿蒙操作系统的智能手机。这意味着此前只用于智慧屏、可穿戴设备等产品的鸿蒙操作系统终于覆盖到华为最主要的终端。从目前市场上的操作系统市场比例上看&#xff0c;安卓占据了全球68.63%&#xff0c;苹果占据了30.99%…

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

这个模块简单&#xff0c;且无实际作用&#xff08;该模块用于支持ABP框架单元测试的&#xff09;。一般实际项目中都有用数据库做持久化&#xff0c;用了数据库就无法用这个MemoryDB 模块了。原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍)&#xff0c;一般用了数…

规定输出字段html,控制视图输出的包装字段内容的 HTML 标签《 Drupal 7 基础 (上) 》...

视图允许我们为分别定义用来包装字段内容&#xff0c;字段标签&#xff0c;还有字段内容和字段标签的 HTML 标签。这里我们先来看一下电影的标题字段&#xff0c;可以使用 Chrome 浏览器的开发者工具查看一下&#xff0c;鼠标放在其中的一个电影标题内容上&#xff0c;点击右键…

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

这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类&#xff0c;封装了对MongoDb数据库的操作。 这个module通过引用MongoDB.Driver&#xff0c;MongoDB.Bson&#xff0c;MongoDB.Driver.Core,MongoDB.Driver.Legacy类库来操作MongoDb. 当项目不需要依赖于关系型…

将自己的女朋友的话和视频做为启动音乐和启动动画(XP)

找到C:\windows\system32\oobe\images&#xff0c;可以看到3个wma文件&#xff0c;其中title.wma文件时xp的启动音乐&#xff0c;intro.wmv文件时xp的启动动画。哈哈&#xff0c;以后有女朋友了&#xff0c;只要替换一下文件&#xff0c;就可以把她的声音和视频设置在xp系统里。…

html防替换资源,Webpack中有没有替换html静态资源的插件

比如html文件中有如下代码<div><!-- /dev 是开发目录 --><img src"/dev/img.png"></div>然后经过处理后变成如下<div><!-- /static 是上线目录, a7l3k2n是图片的hash --><!-- 同时把img.png从/dev目录移动到/static目录 --&g…

【转】ABP源码分析三十:ABP.RedisCache

ABP 通过StackExchange.Redis类库来操作Redis数据库。 AbpRedisCacheModule&#xff1a;完成ABP.RedisCache模块的初始化(完成常规的依赖注入) AbpRedisCacheConfig&#xff1a;定义了connectionStringKey和databaseIdAppSetting的值。这两个值对象redis 在web.config中的key值…

平板可以看html文档吗,iPad如何看电脑里的视频 如何使用Ipad看电脑里的电影

电脑上的视频怎么在iPad上观看&#xff1f;如何在ipad播放电脑中的视频首先&#xff0c;看你的视频格式。如果是mp4&#xff0c;就可以直接放入ipad自带浏览器或者通过itunes直接传。其他格式的需要下载第三方播放器&#xff0c;目前使用较多的支持高清播放的有Oplayer&#xf…

【转】ABP源码分析三十一:ABP.AutoMapper

这个模块封装了Automapper,使其更易于使用。 下图描述了改模块涉及的所有类之间的关系。 AutoMapAttribute&#xff0c;AutoMapFromAttribute和AutoMapToAttribute&#xff1a;这三个attribute用于标注一个类到另外一个类的map方向。 AutoMapperHelper: 通过调用Automapper的A…

SQL语言的事务机制_转摘

什么是数据库事务  数据库事务是指作为单个逻辑工作单元执行的一系列操作。设想网上购物的一次交易&#xff0c;其付款过程至少包括以下几步数据库操作&#xff1a;   更新客户所购商品的库存信息    保存客户付款信息--可能包括与银行系统的交互    生成订单并且保…

html背景定位,css background-position center left right top bottom代表意思

background-position:center right这里center right分别代表什么,引入对图片背景定位介绍background-position是用于定位背景图片中对象中显示定位&#xff0c;比如图片作为背景时在对象内什么位置开始显示&#xff0c;显示样式等。比如让一个图片作为对象背景距离对象左边或右…

【转】ABP源码分析三十二:ABP.SignalR

Realtime Realtime是ABP底层模块提供的功能&#xff0c;用于管理在线用户。它是使用SignalR实现给在线用户发送通知的功能的前提 IOnlineClient/OnlineClient: 封装在线用户的信息 OnlineClientManager/IOnlineClientManager: 用于提供基本维护在线用户的方法。其内部维护了…

数据库人员面试:SQL Server常用测试题

题目1 问题描述: 为管理岗位业务培训信息&#xff0c;建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄 C (C#,CN ) C#,CN 分别代表课程编号、课程名称 SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩 1. 使用标准SQL嵌…

html5中将doctype分为几种,html5与html 4.01的区别 doctype几种分类及其不同

声明必须是 HTML 文档的第一行&#xff0c;位于 标签之前。声明不是 HTML 标签&#xff1b;它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令。在 HTML 4.01 中&#xff0c; 声明引用 DTD&#xff0c;因为 HTML 4.01 基于 SGML。DTD 规定了标记语言的规则&#xf…

【转】ABP源码分析三十三:ABP.Web

ABP.Web模块并不复杂&#xff0c;主要完成ABP系统的初始化和一些基础功能的实现。 AbpWebApplication : 继承自ASP.Net的HttpApplication类&#xff0c;主要完成下面三件事 一&#xff0c;在Application_Start完成AbpBootstrapper的初始化。整个ABP系统的初始化就是通过AbpBoo…