ABP學習實踐 七 領域事件

2021-10-02 11:50:18 字數 2617 閱讀 4077

事件是在軟體開發過程中經常用到的一種思路和形式,事件常常是和觀察者模式、訂閱發布這樣的詞彙聯絡在一起。在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.領域事...