另外, 為了能讓大家對我有一個更加具體的瞭解, 我也特地按照flyzb的思想設計了一個基於領域事件和DDD的架構.

tangxuehua發表於2011-01-26

該架構的核心思想是:

1. 領域模型好比是一個實心的圓球,圓球的表層就是領域服務(Domain Service),圓球內部由各個相互平等的,沒有相互依賴的,通過事件訊息完成相互協作的領域物件組成;

2. 領域模型應該依賴於一箇中央事件處理器,該處理器負責統一協調領域模型的各種動作;具體地說就是該處理器能夠智慧的知道任何一個領域事件該如何處理,也就是說它知道該呼叫哪些事件響應者完成各自的響應;

3. 關於領域服務,應該是非常薄的一層,它的職責非常簡單,就是生成領域事件,然後讓事件處理器去釋出領域事件,僅此而已;

4. 關於領域物件,每個領域物件主要做兩件事情:一:在需要的時候生成領域事件,然後讓事件處理器釋出該領域事件;二:響應並處理一些它所關心並能單獨處理的領域事件;

5. 領域模型應該處在正在應用的中心位置,因為它包含了整個應用的所有業務邏輯,包括流程控制邏輯和業務邏輯。任何其他的東西比如資料持久層、應用層、表現層都只是一些輔助的東西。比如資料持久層只是用來將領域模型的任何修改持久化到某種資料儲存介質如資料庫,應用層只是用來將領域模型做進一步封裝(Facade),它提供面向使用者操作的各種應用介面供表現層使用,應用層中所有介面可以分為兩類:1)呼叫領域模型實現,一般是行為型操作(ADD、Update、Delete、或其任意組合);2)呼叫查詢服務(該查詢服務完全和領域模型無關)提供各種查詢功能;也就是說在我看來我們應該應用CQRS的思想來實現應用層。最後,表現層其實和領域模型沒有任何關係,它應該需要使用應用層即可。

總結:基於上面的思想,一個完整的領域模型由三個要素組成:領域服務+領域物件+領域事件。然後,為了能讓這三個要素能協調工作,還需要藉助一箇中央事件處理器來完成統一協調的工作。另外,領域模型處於整個應用的中心,其他任何東西都只是作為輔助產品將該中心從各種角度進行擴充套件以滿足使用者需要;或者實現持久化目的,以便整個領域模型的狀態可以被儲存和恢復。

架構原始碼為:

http://files.cnblogs.com/netfocus/EventBasedDDDExample.rar

希望能得到大家的意見和建議.

相關文章