事件是在軟體開發過程中經常用到的一種思路和形式,事件常常是和觀察者模式、訂閱發布這樣的詞彙聯絡在一起。在abp框架中同樣也少不了事件,也就是領域事件。
在具體業務中常常會有這樣的需求,以前面的貨品管理功能為例,對於某種特定型別的貨品,我們希望在貨品庫存數量低於某個特定值的時候得到提醒,以便於進行採購**或其他操作,就是常說的庫存預警功能。解決這個問題最簡單的思路就是寫乙個方法迴圈查詢庫存數量,當數量低於特定值時執行預先設定的操作。但這樣有兩個比較明顯的問題:一是迴圈的讀取查詢庫存耗時耗力,浪費大量資源;二是庫存預警功能和貨品管理功能的**關聯性太強,一旦業務需求發生調整,改起來真是「牽一髮而動全身」,耦合性太強。在這樣的背景下,事件就有了用武之地。
簡單來說,乙個類可以定義其專屬的事件並且其它類可以註冊該事件並監聽,當事件被觸發時可以獲得事件通知。當我們需要解耦業務邏輯以及對領域物件的變化做出反應時,就需要用到領域服務。
在abp框架中,領域事件相關的類位於abp.events.bus命名空間下。事件是派生自 eventdata 的類。在領域層abpdemo.core中定義乙個貨品數量變更的事件。
///
/// 貨品庫存變更事件
///
public
class
goodsnumchangedeventdata
:eventdata
///
/// 貨品名稱
///
public string goodsname
///
/// 當前數量
///
public
int goodsnum
///
/// 數量下限
///
public
int minnum
}
///
/// 貨品管理-應用服務
///
public
class
//事件匯流排
private
const
int minnum =50;
//貨品數量下限
public
(irepository
repository,igoodsrecordmanager goodsrecordmanager,igoodsmanager goodsmanager)
:base
(repository)
///
/// 出庫
///
///
///
public async task
out(inoutgoodsdto input)
goodsrecord record = input.mapto()
; record.operatetype = goodsoperatetype.out;
string recordid = await _goodsrecordmanager.
outrecord
(record)
; entity = await repository.
updateasync
(entity);if
(entity.goodsnum<=minnum)
//貨品數量低於下限時觸發事件);
} detailgoodsdto result = entity.mapto()
;return await task.
fromresult
(result);}
}
在事件觸發後,事件的訂閱者就可以收到通知,進而對事件進行處理。在abp框架中,要對領域事件進行處理,就要實現ieventhandler介面。
public
class
goodschangedmanager
: ieventhandler
, itransientdependency
當前庫存為,低於最低允許庫存,請及時採購補充!"
, eventdata.goodsname, eventdata.goodsnum, eventdata.minnum);/*
* to do
* 後續處理
* */
}}
在上面的**中,當貨品數量低於下限時觸發事件,在handedevent方法中就可以進行具體操作了,比如說通知其他領域物件或傳送訊息到外部。
在abp框架中,專案啟動時所有實現ieventhandler介面的類都會自動註冊到事件匯流排中。當事件發生, 通過依賴注入(di)來取得處理器(handler)的引用物件並且在事件處理完畢之後將其釋放。除了自動註冊事件外,abp框架還支援手動註冊和解除安裝事件。
//註冊事件
var goodschangedevent = eventbus.register
(data =
>);
//取消註冊事件
goodschangedevent.
dispose()
;
以上示例比較簡單,只是為了說明問題,更多深度用法可以檢視官方文件並在實際工作中靈活運用。
源**示例-github
DDD 領域驅動設計學習(三) 領域事件
在eric的 領域驅動設計 中並沒有提到領域事件,領域事件是在後來才被正式提出來的,並成為ddd通用語言 ul 的正式組成部分。領域事件 de 是什麼?領域事件的作用又是什麼?介紹領域事件的書籍和文章也比較多了,本文最後也推薦了幾篇很好的文章。寫這篇文章更希望多思考一下自己的一些疑問,乙個是為什麼要...
ABP學習實踐 九 使用CAP整合訊息佇列
領域事件可以觸發應用內領域物件變化的通知,結合實時訊息 例如signalr 可以將通知推送給外部應用。但是訊息推送的可靠性如何保證?abp框架能整合訊息佇列嗎?當然可以,下面就是示例。實時資料傳輸和訊息佇列是兩類不同的技術方案,有著不同的應用場景,但又有一定的相似性。實時資料傳輸更偏重於 實時 兩個...
簡單的學習,實現,領域事件,事件儲存,事件溯源
自己以前都走了彎路,以為學習戰術設計就會ddd了,其實ddd的精華在戰略設計,但是對於我們菜鳥來說,學習一些技術概念也是挺好的 經常看到這些術語,概念太多,也想簡單學習一下,記憶力比較差記錄一下實現的細節1.領域事件是過去發生的與業務有關的事實,一但發生就不可更改,所以儲存事件時只能追加 3.領域事...