課程大綱:
一、領域建模的方法
1、領域建模:
領域建模與設計的關系優秀的軟件系統與好的軟件設計息息相關,但最關鍵的還是在于對需求的理解。如果不能正確的理解軟件需求,那么再好的設計也不能設計出好的軟件。正確的做事情固然重要,更重要的是要做正確的事。然而,需求到設計存在巨大的鴻溝,因為需求是站在業務角度來考慮,而設計往往會站在實現角度。領域建模就是為這二者搭建一個溝通與轉換的橋梁。
2、統一語言(Ubiquitous Language):
為了更好的理解需求,我們需要與領域專家一起梳理目標領域的統一語言,從而就領域術語達成一致,并有利于領域建模。
二、領域驅動設計的戰略設計
1、限界上下文(Bounded Context):
若要進行領域建模,并將業務需求逐步演化為架構設計,則需要引入DDD(領域驅動設計)的戰略設計作為指導。場景圖與限界上下文可以很好地結合,幫助架構師更好地識別各個子領域的概念邊界與設計邊界。如此則可以運用“分而治之”的思想識別出整個系統的業務邏輯邊界與物理邊界。
2、場景驅動設計:
場景驅動設計的核心在于識別場景,它需要設計者結合具體的業務場景,分析業務流程,以此驅動出用例;再以用例驅動對業務邏輯的建模。場景驅動設計的核心模型為6W模型,即Who,Why,When,What,Where與hoW。它將對應職責模型的業務價值、業務功能與業務實現,并從角色的角度思考對象之間的協作以及設計邊界。
3、用例方法 (Use Case):
通過利用傳統的用例方法來幫助我們驅動出領域的限界上下文。
4、上下文映射圖 (Context Map):
限界上下文之間主要存在的組織模式與集成模式,這其中包括防腐層,開放服務調用等。利用上下文映射圖,有助于識別上下文之間的關系,思考處于上下文內領域模型之間的通信方式,從而幫助架構師驅動出最終的應用邏輯架構。
三、領域驅動設計的架構設計
1、分層架構 (Layered Architecture):
分層架構模式是應用最為廣泛的架構模式,它根據關注點分離的架構原則,針對表現層、領域層和基礎設施層進行層次分離。我們將從全新視角審視分層架構,針對大型軟件系統分析該如何進行分層架構設計。
2、CQRSCQRS風格:
即命令查詢職責分離(CommandQuery Responsibility Segregation),它結合了消息處理、事件處理的架構風格,是對多種設計模式的綜合運用,適用于處理讀寫比例高,需要支持可伸縮性的大型系統。
3、事件驅動架構 (Event-Driven Architecture):
事件驅動架構(Event-DrivenArchitecture,EDA)是一種用于處理事件生成、發現和處理等任務的軟件架構。事件往往對應于軟件系統的狀態機,狀態的遷移就是用事件來觸發的。因而,事件能夠很好地體現這樣的業務模型。同時,基于事件的軟件架構可以幫助我們更好地建立松散耦合的模塊化架構。
四、領域驅動設計的戰術設計
1、領域模型:
通過限界上下文,可以幫助我們分析系統的領域模型,包括系統的核心領域與子領域。確定系統的核心領域與子領域可以幫助架構師合理分配資源(包括時間資源與人力資源)。而對子領域的進一步識別,可以幫助架構師更好地識別可重用資源,包括可重用的功能模塊,確定技術棧,決定構建還是購買的架構戰略。
2、四色建模法:
首先以滿足管理和運營的需要為前提,尋找需要追溯的事件。根據這些需要追溯,尋找足跡以及相應的時標性對象。尋找時標對象周圍的人/事/物。從中抽象角色,把一些信息用描述對象補足。
3、實體(Entity)與值對象(Value Object):
這兩個概念都是領域對象的體現,二者的主要區別在于對“標識”的運用。本部分的內容深入展開對實體標識的討論,揭示實體的本質特征,挖掘實體的關鍵行為。通過識別角色與職責對實現進行分析。我們還將通過深入講解值對象的特征幫助我們分辨值對象與實體,使得我們可以在領域驅動設計中有效地運用實體與值對象。本部分內容還包括持久化值對象,以及領域驅動設計與ORM之間的關系。
4、領域服務 (Domain Service):
通過講解什么是領域服務,什么不是領域服務理清領域服務的概念,并講解如何建模領域服務。討論領域服務和面向接口設計思想。
5、領域事件 (Domain Event):
事件驅動架構的主要對象即為領域事件,我們要分清在何時以及為什么要使用領域事件,并對領域事件進行建模。通過講解發布者-訂閱者模式講解如何在領域模型和限界上下文中發布領域事件。同時,針對事件進行存儲的EventSource也與CQRS架構風格直接相關。
6、聚合 (Aggregation):
聚合是領域驅動設計最為重要的領域概念。我們將深入探討聚合的設計原則,并辨別在聚合設計中可能出現的壞味道,并提出針對性的解決方案。這些原則和方案包括:在一致性邊界之內建模真正的不變量,設計小的聚合,通過唯一標識引用其他聚合,在邊界外滿足最終一致性。
7、工廠(Factory)和資源庫(Repository):
工廠和資源庫都是管理領域對象(實體、值對象和服務)生命周期的對象。工廠主要針對內存中對象從無到有的創建過程,與設計模式的工廠模式基本相似。資源庫則分為面向集合的資源庫與面向持久化的資源庫。我們將重點講解與資源庫直接相關的技術細節,包括如何選擇資源庫的方式,如何針對聚合持久化資源庫,如何管理事務,以及分辨資源庫與數據訪問對象(DAO)之間的異同。
8、應用層(Application Layer)設計:
為UI提供的應用服務,其目的在于管理和協調領域對象,并為領域對象提供橫切關注點的內容。好的應用服務設計不應該承擔任何與領域邏輯有關的職責。應用層是架構層面的外觀與適配器模式的體現。它可以提高軟件系統架構的可用性與簡單性,也能夠更好地與面向服務架構或RESTful架構風格結合。
五、項目實踐演練
1、案例名稱:基于多租戶的社交網絡系統以及項目管理系統的領域驅動設計
這是領域驅動設計過程的完整案例分析,從需求開始著手,開展對整個系統的架構分析、領域概念識別與分析,并對建立的領域模型進行迭代與演化,核心領域概念的演進,掃清領域設計過程中的認知障礙,并總結了領域驅動設計過程的一些經驗教訓。
項目中包含了真實的案例需求,以及符合領域驅動設計各種知識點的案例病癥分析,從對比入手來探討好的領域驅動設計方法。同時,還將引入大量的可視化圖形、設計圖與代碼幫助學員理解如何在真實項目中運用領域驅動設計的思想,指導設計人員進行良好的設計。

