項目架構實戰:分層架構規範之CQRS分離

一、引入的目的

領域驅動作爲一種系統分析的方法論,分清了職責範圍、通過分層剝離了業務邏輯,但是在實踐過程中依然會遇到很多問題。例如常見的查詢問題: 一個業務系統會存在各種查詢功能,例如列表查詢、分頁查詢等,沒有業務邏輯(或者很少),如果按照常規的領域分層會導致大量的模型轉換工作,並且存在大量的分頁信息(pageSize\pageNo\totalPage等)無處安放,因爲它們並不屬於Domain內的屬性或行爲,如果算Domain裏的屬性,會導致Domain越來越大。

CQRS正好可以解決領域驅動中的查詢問題

二、什麼是CQRS

CQRS(Command Query Responsibility Segregation),Command 與 Query 分離的一種模式。

Command:命令則是對會引起數據發生變化操作的總稱,即新增,更新,刪除這些操作,都是命令

Query:查詢則不會對數據產生變化的操作,只是按照某些條件查找數據

CQRS 的核心思想是將這兩類不同的操作進行分離,可以是兩個獨立的應用,兩個不同的數據源,也可以是同一個應用內的不同接口上。

從上圖可看出,把數據的變更通過數據同步到另一個庫用來查詢數據,其實就是數據異構。但這不是我們現在需要做的,我們是要利用CQRS的思想解決領域驅動中查詢功能實現複雜的問題

三、領域驅動中落地CQRS

落地的DDD+CQRS使用了對稱性架構,如下圖:

 

 

1.當一個命令Command請求過來時,會通過應用層的CommandService去協調領域層工作
2.當一個查詢Query請求過來時,則直接通過基礎實施的實現與數據庫或者外部服務交互

以上是理論上的描述,在應對大量查詢功能的實際場景如何落地呢?
1.在Facade.api層對每個模塊分離出CommonController\QueryController
2.在QueryController直接使用Mapper直接查詢DB,並完成Entity-->Response的轉換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章