在C#中,一個類可以定義其專屬的事件并且其它類可以注冊該事件并監聽,當事件被觸發時可以獲得事件通知。這對于對于桌面應用程序或獨立的Windows Service來說非常有用。但是, 對于Web應用程序來說會有點問題,因為對象是根據請求(request)被創建并且它們的生命周期都很短暫。我們很難注冊其它類別的事件。同樣地,直接注冊其它類別的事件也造成了類之間的耦合性。
在應用系統中,領域事件被用于解耦并且重用(re-use)商業邏輯。
事件總線
事件總線為一個單體(singleton)的對象,它由所有其它類所共享,可通過它觸發和處理事件。要使用這個事件總線,你需要引用它。你可以用兩種方式來實現:
獲取默認實例( Getting the default instance)
你可以直接使用EventBus.Default。它是全局事件總線并且可以如下方式使用:
EventBus.Default.Trigger(...); //觸發事件
注入IEventBus事件接口(Injecting IEventBus)
除了直接使用EventBus.Default外,你還可以使用依賴注入(DI)的方式來取得IEventBus的參考。這利于進行單元測試。在這里,我們使用屬性注入的范式:
public class TaskAppService : ApplicaService { public IEventBus EventBus { get; set; } public TaskAppService() { EventBus = NullEventBus.Instance; } }注入事件總線,采用屬性注入比建構子注入更適合。事件是由類所描述并且該事件對象繼承自EventData。假設我們想要觸發某個事件于某個任務完成后:
public class TaskCompletedEventData : EventData { public int TaskId { get; set; } }這個類所包含的屬性都是類在處理事件時所需要的。EventData類定義了EventSource(那個對象觸發了這個事件)和EventTime(何時觸發)屬性。
定義事件
ABP定義AbpHandledExceptionData事件并且在異常發生的時候自動地觸發這個事件。這在你想要取得更多關于異常的信息時特別有用(即便ABP已自動地紀錄所有的異常)。你可以注冊這個事件并且設定它的觸發時機是在異常發生的時候。
ABP也提供在實體變更方面許多的通用事件數據類: EntityCreatedEventData, EntityUpdatedEventData和EntityDeletedEventData。它們被定義在Abp.Events.Bus.Entitis命名空間中。當某個實體新增/更新/刪除后,這些事件會由ABP自動地觸發。如果你有一個Person實體,可以注冊到EntityCreatedEventData,事件會在新的Person實體創建且插入到數據庫后被觸發。這些事件也支持繼承。如果Student類繼承自Person類,并且你注冊到EntityCreatedEventData中,接著你將會在Person或Student新增后收到觸發。
觸發事件
觸發事件的范例如下:
public class TaskAppService : ApplicationService { public IEventBus EventBus { get; set; } public TaskAppService() { EventBus = NullEventBus.Instance; } public void CompleteTask(CompleteTaskInput input) { //TODO: 已完成數據庫上的任務 EventBus.Trigger(new TaskCompletedEventData { TaskId = 42 } ); } }
新聞熱點
疑難解答
圖片精選