?? Little Spring Rapid Development Framework
功能點設計思路
分層結(jié)構(gòu)
hierarchy.png
展現(xiàn)層
負責向用戶展現(xiàn)信息以及解釋用戶命令典鸡。更細的方面來講就是:
- 請求應用層以獲取用戶所需要展現(xiàn)的數(shù)據(jù)直撤;
- 發(fā)送命令給應用層要求其執(zhí)行某個用戶命令粥脚;
應用層
很薄的一層见间,定義軟件要完成的所有任務医清。對外為展現(xiàn)層提供各種應用功能(包括查詢或命令)瑟俭,對內(nèi)調(diào)用領域?qū)樱I域?qū)ο蠡蝾I域服務)完成各種業(yè)務邏輯,應用層不包含業(yè)務邏輯契邀。
領域?qū)?/h4>
負責表達業(yè)務概念,業(yè)務狀態(tài)信息以及業(yè)務規(guī)則靶衍,領域模型處于這一層沦辙,是業(yè)務軟件的核心夫植。
基礎設施層
本層為其他層提供通用的技術能力;提供了層間的通信油讯;為領域?qū)訉崿F(xiàn)持久化機制详民;總之,基礎設施層可以通過架構(gòu)和框架來支持其他層的技術需求撞羽;
功能點分塊結(jié)構(gòu)
DDD.png
聚合
通過定義對象之間清晰的所屬關系和邊界來實現(xiàn)領域模型的內(nèi)聚阐斜,并避免了錯綜復雜的難以維護的對象關系網(wǎng)的形成。聚合定義了一組具有內(nèi)聚關系的相關對象的集合诀紊,我們把聚合看作是一個修改數(shù)據(jù)的單元。
倉儲
- 倉儲被設計出來的目的是基于這個原因:領域模型中的對象自從被創(chuàng)建出來后不會一直留在內(nèi)存中活動的隅俘,當它不活動時會被持久化到數(shù)據(jù)庫中邻奠,然后當需 要的時候我們會重建該對象;重建對象就是根據(jù)數(shù)據(jù)庫中已存儲的對象的狀態(tài)重新創(chuàng)建對象的過程为居;所以碌宴,可見重建對象是一個和數(shù)據(jù)庫打交道的過程。從更廣義的 角度來理解蒙畴,我們經(jīng)常會像集合一樣從某個類似集合的地方根據(jù)某個條件獲取一個或一些對象贰镣,往集合中添加對象或移除對象。也就是說膳凝,我們需要提供一種機制碑隆, 可以提供類似集合的接口來幫助我們管理對象。倉儲就是基于這樣的思想被設計出來的蹬音;
- 倉儲里面存放的對象一定是聚合上煤,原因是之前提到的領域模型中是以聚合的概念去劃分邊界的;聚合是我們更新對象的一個邊界著淆,事實上我們把整個聚合看 成是一個整體概念劫狠,要么一起被取出來,要么一起被刪除永部。我們永遠不會單獨對某個聚合內(nèi)的子對象進行單獨查詢或做更新操作独泞。因此,我們只對聚合設計倉儲苔埋。
- 盡管倉儲可以像集合一樣在內(nèi)存中管理對象懦砂,但是倉儲一般不負責事務處理。一般事務處理會交給一個叫“工作單元(Unit Of Work)”的東西。關于工作單元的詳細信息我在下面的討論中會講到孕惜。
- 倉儲在這里僅僅對自身的聚合進行簡單查詢和存儲更新操作愧薛,如果涉及到了復雜查詢(涉及多個功能點的關聯(lián)查詢)目前給出的解決方案是在基礎設施層(Infrastructure)創(chuàng)建對應的查詢服務(引被應用層
controller
直接調(diào)用故此處需自行開啟事務,并使用SQLQuery執(zhí)行對應的SQL)衫画。