1. 程式人生 > >ABP原始碼分析二十五:EventBus

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容器。

EntityChangedEventDataEntityChangingEventData

EntityCreatedEventDataEntityCreatingEventDataEntityDeletedEventDataEntityDeletingEventDataEntityUpdatedEventDataEntityUpdatingEventData:都用於存放事件資料,但更重要的是他們通過其自生的型別表示不同的事件型別。

IEntityChangeEventHelper/EntityChangeEventHelper:用於觸發entity change(create,delete, update)相關的事件.

Abp中只有兩處引用了IEntityChangeEventHelper,分別是AbpDbContextAbpNHibernateInterceptor。在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

IEventData/EventData: 封裝了EventData資訊,觸發event的源物件和時間 IEventBus/EventBus: 定義和實現了了一系列註冊,登出和觸發事件處理函式的方法。EventBus定義了一個Dictionary容器來存放事件和處理該事件的物件(其實不是物件而是Factor

ABP原始碼分析核心框架中的一些其他功能

本文是ABP核心專案原始碼分析的最後一篇,介紹一些前面遺漏的功能 AbpSession AbpSession: 目前這個和CLR的Session沒有什麼直接的聯絡。當然可以自定義的去實現IAbpSession使之與CLR的Session關聯 IAbpSession:定義如下圖中的四個屬性。 NullA

ABP原始碼分析ABP.MongoDb

這個Module通過建立一個MongoDbRepositoryBase<TEntity> 基類,封裝了對MongoDb資料庫的操作。 這個module通過引用MongoDB.Driver,MongoDB.Bson,MongoDB.Driver.Core,MongoDB.Driver.Legacy類

ABP原始碼分析ABP.Entity Framework

IRepository:介面定義了Repository常見的方法 AbpRepositoryBase:實現了IRepository介面的常見方法 EfRepositoryBase:實現了AbpRepositoryBase中定義的抽象方法:GetAll,Insert,Delete,Update。在實

ABP原始碼分析ABP中動態WebAPI原理解析

動態WebAPI應該算是ABP中最Magic的功能之一了吧。開發人員無須定義繼承自ApiController的類,只須重用Application Service中的類就可以對外提供WebAPI的功能,這應該算是對DRY的最佳詮釋了. 如下圖所示,一行程式碼就為所有實現了IApplicationService的

ABP原始碼分析Feature

Feature是什麼?Feature就是對function的分類方法,其與function的關係就比如Role和User的關係一樣。 ABP中Feature具有以下屬性: 其中最重要的屬性是name,用以表示feature的Identity,一個feature一個name. 一個Feature可以有一組子F

ABP原始碼分析ABP.MemoryDB

這個模組簡單,且無實際作用。一般實際專案中都有用資料庫做持久化,用了資料庫就無法用這個MemoryDB 模組了。原因在於ABP限制了UnitOfWork的型別只能有一個(前文以作介紹),一般用了資料庫的必然要注入efUnitOfWork. 而注入了efUnitOfWork就不能在注入MemoryDbUnitO

ABP原始碼分析Notification

NotificationDefinition: 用於封裝Notification Definnition 的資訊。注意和Notification 的區別,如果把Notification看成是具體的訊息內容,NotificationDefinition則是對這個訊息自身的定義(可理解為訊息的型別)。

ABP原始碼分析ApplicationService

IApplicationService : 空介面,起標識作用。所有實現了IApplicationService 的類都會被自動注入到容器中。同時所有IApplicationService物件都會被注入一些攔截器(例如:auditing, UnitOfWork等)以實現AOP AbpServiceBase:

ABP原始碼分析Navigation

MenuDefinition:封裝了導航欄上的主選單的屬性。 MenuItemDefinition:封裝了主選單的子選單的屬性。子選單可以引用其他子選單構成一個選單樹 UserMenu/UserMenuItem:封裝了用於顯示給使用者的選單/以及子選單集合。 ABP通過MenuDefinition/M

ABP原始碼分析ABP.AutoMapper

這個模組封裝了Automapper,使其更易於使用。 下圖描述了改模組涉及的所有類之間的關係。 AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttribute:這三個attribute用於標註一個類到另外一個類的map方向。 Auto

ABP原始碼分析ZERO的Audit,Setting,Background Job

AuditLog: 繼承自Entity<long>的實體類。封裝AuditLog的資訊。 AuditingStore: 實現了IAuditingStore介面,實現了將AuditLog的資訊儲存到資料庫的功能。其通過IRepository<AuditLog, long>例項完成對資料

ABP原始碼分析ABP.Web.Mvc

ABP.Web.Mvc模組主要完成兩個任務: 第一,通過自定義的AbpController抽象基類封裝ABP核心模組中的功能,以便利的方式提供給我們建立controller使用。 第二,一些常見的基礎功能的實現。 AbpController:這是一個抽象基類,繼承自MVC Controller,是A

ABP原始碼分析ABP.Web.Api

這裡的內容和ABP 動態webapi沒有關係。除了動態webapi,ABP必然是支援使用傳統的webApi。ABP.Web.Api模組中實現了一些同意的基礎功能,以方便我們建立和使用asp.net webApi。 AbpApiController:這是一個抽象基類,繼承自ApiController,是AB

ABP原始碼分析ZERO的配置

ABP Zero模組中需要配置的地方主要集中在三塊:配置靜態的role,配置外部認證源,以及配置本地化語言和資源。 UserManagementConfig/IUserManagementConfig:定義了一個配置項,用於配置外部認證源。預設情況下,ABP Zero使用AbpUser表作為身份

ABP原始碼分析ABP.Hangfire

ABP對HangFire的整合主要是通過實現IBackgroundJobManager介面的HangfireBackgroundJobManager類完成的。 HangfireBackgroundJobManager:實現了介面IBackgroundJobManager中的方法EnqueueAsync,通過

ABP原始碼分析ABP.Web.Api Script Proxy API

ABP提供Script Proxy WebApi為所有的Dynamic WebApi生成訪問這些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理。這些個代理就是javascript指令碼,通過這些代理可以簡單的訪問Dynamic webApi。 如下例項演示一個最基本的

ABP原始碼分析ABP中的異常處理

ABP 中異常處理的思路是很清晰的。一共五種型別的異常類。 AbpInitializationException用於封裝ABP初始化過程中出現的異常,只要丟擲AbpInitializationException異常就可以,無須做額外處理。這類異常往往是需要維護人員介入分析的。 其他四個異常都在AbpCon

ABP原始碼分析ZERO的身份認證

ABP Zero模組通過自定義實現Asp.Net Identity完成身份認證功能, 對Asp.Net Identity做了較大幅度的擴充套件。同時重寫了ABP核心模組中的permission功能,以實現授權。注意:ABP僅僅使用了Asp.Net Identity的身份認證功能,但沒有使用Asp.Net Id

ABP原始碼分析ABP.SignalR

Realtime Realtime是ABP底層模組提供的功能,用於管理線上使用者。它是使用SignalR實現給線上使用者傳送通知的功能的前提 IOnlineClient/OnlineClient: 封裝線上使用者的資訊 OnlineClientManager/IOnlineClientManager: