SlideShare ist ein Scribd-Unternehmen logo
1 von 57
8th DDD 讀書會-
限界上下文整合
我還是喜歡稱它是-限界上下文互動
大綱
• 領域的概念
• 整合的基礎
• REST與DDD
• 事件與DDD
2
理解限界上下文前
問題域 解決方案域
討論的主題和方向,兩者不同,但在最後需要整合
領域的概念
3
問題域
術語構成了問題域的核心實體。
提問的範圍、問題之間的內在關係和邏輯可能性空間。
問題域不僅只有使用者需求。
領域的概念
4
解決方案域
圖片來源: https://kikobeats.com/what-is-solution-domain/
領域的概念
5
領域
每個組織都有其業務範圍,而這個業務範圍以及在其中
所進行的活動即為領域。
一個組織所做的事情以及其中所包含的一切。
包含了問題域和解決方案域。
領域的概念
6
不採用領域思維的弊端
當團隊開始建模的時候,會因為沒有全局觀,而造成建模的失誤。
7
領域的概念
子領域劃分的觀點
在領域中進一步分析和拆解,從大領域切割成多個子領域。
在確認過領域邊界後,可以看見全貌並且方便更深入的分析。
子領域劃分讓團隊更易於理解領域
領域的概念
8
子領域劃分的範例
領域的概念
9
資訊系統
多個子領域(或部份)構成一個資訊系統。
領域的概念
10
限界上下文解析
“Explicitly define the context within which a model applies. Explicitly set boundaries in terms of team organization,
usage within specific parts of the application, and physical manifestations such as code bases and database schemas.
Keep the model strictly consistent within these bounds, but don’t be distracted or confused by issues outside.”
--wikipedia
在應用程式中的某一部份
設定一個顯示的邊界
讓模型可以有強一致性
避開無謂的干擾
領域的概念
11
限界上下文的真實樣貌
限界上下文引入了通用語言的概念。
限界上下文確立了解決方案的邊界。
限界上下文即為系統的商業能力。
領域的概念
12
商業結構
商務能力
商務功能
商務活動
人力資本
管理
人才管理
招募 開發 保留 評估 推薦
實現
概念性
邏輯性
商務能力是組織進行商務活動
持續穩定達成商務目標,所必需
的商務功能。
新
血
實現
目
標
領域的概念
13
當所有的子領域都是同級的,當我們開始實做時,將會遇到資源不足的問題
子領域劃分可能遇到的問題
領域的概念
14
子領域劃分的技巧-
價值導向
領域的概念
確保資源利用率的最大化,採用價值(Value)的概念對領域
進行分割成多個子領域。
BUSINESS
GOAL
核心子領域
支持子領域
支持子領域
通用子領域
15
限界上下文與子領域
理想上是一對一,但實際上,可能會有遺留系統參與到系統中。
領域的概念
16
在思考整合之前
整合的基礎
在你開始整合限界上下文之前,一定要先深入理解通用語言。
17
通用語言
整合的基礎
不同限界上下文對於同一個名詞有不同的定義。
通用語言和限界上下文有緊密的關係。
沒有限界上下文,通用語言就失去理解能力。
18
通用語言實例
整合的基礎
在不同限界上下文中,對於User的定義和資料結構,完全不同。
19
在思考整合之前
整合的基礎
在你開始整合限界上下文之前,一定要先深入理解限界上下文的關係。
20
限界上下文關係的起手式
先分析限界上下文之間的上下游關係。
整合的基礎
21
限界上下文的關係樣式
圖片來源: https://herbertograca.com/2016/02/05/ddd-14-maintaining-model-integrity/
整合的基礎
22
團隊溝通力
管控系統力
限界上下文範例
圖片來源: https://www.informatik-aktuell.de/entwicklung/methoden/ddd-context-is-king-kein-context-keine-microservices.html
整合的基礎
23
限界上下文整合關鍵實務
整合的基礎
• Open Host Service
• Published Language
• Anti corruption Layer
24
開放主機服務
整合的基礎
• 定義一個協定,讓你的子系統透過該協定來訪問你的服務。
• 公開協定,這樣任何想與你整合的人都可以使用該協定。
• 當有新的整合需求時,對協定進行改進或擴充。
• 對於一些特殊的需求,可以採用一次性的翻譯予以處理,這樣可以保持協定的
簡單性和延續性。
25
發布語言
整合的基礎
• 在兩個限界上下文之間,翻譯模型需要一種公用的語言。
• 使用發布出來的共享語言來完成整合交流。
• 發布語言通程與開放主機服務一起使用。
26
防腐層
整合的基礎
• 整合兩個設計良好的限界上下文時,翻譯層可能很簡單,甚至能夠優雅地實現。
• 若無法套用:共享內合、合作關係或是客戶-供應,則翻譯將會變得複雜。
• 下游需要依據自己的領域模型建構一個單獨的層,該層作為上游系統所提供的
模型進行翻譯轉換。
27
整合的基礎
為什麼要使用防腐層
如果直接將領域模型作為回傳的物件,則下游將被強迫與上游的
模型緊密結合,如此一來,兩者關係就會成為-遵奉者 or 共享內核。
防腐層實例
整合的基礎
基本三元素:
• HttpClient
• Adapter
• Translator
建議的整合方式
整合的基礎
RPC REST Event
本書僅討論REST和Event整合的方式。
30
REST描述
REST與DDD
31
Representational State Transfer (REST) is a software architectural style that defines a set of constraints to be used for
creating Web services. Web services that conform to the REST architectural style, called RESTful Web services (RWS),
provide interoperability between computer systems on the Internet.
RESTful Web services allow the requesting systems to access and manipulate textual representations of Web resources by
using a uniform and predefined set of stateless operations.
Other kinds of Web services, such as SOAP Web services, expose their own arbitrary sets of operations.
--wikipedia
它是Architectural style
資源+表現型式+狀態變化
一組基本的操作
REST操作
REST與DDD
32
Route
name
URL HTTP
Verb
描述 是否為
冪等
Index /blogs
GET
顯示blogs資訊
New /blog/new 顯示新增blog的表單資訊
Show /blogs/:id 顯示指定的blog資訊
Edit /blogs/:id/edit 顯示編輯blog的表單資訊
Create /blogs POST 新增blog
Update /blogs/:id PUT 異動已存在的blog資訊
Patch /blogs/:id PATCH 異動已存在的部份blog資訊
Destroy /blogs/:id DELETE 刪除已存在的blog
REST表現形式
REST與DDD
33
REST的表現形式即為發布語言(Published Language)
雙方的傳輸協定+資料格式都事先知道
REST的狀態移轉
REST與DDD
34
原始狀態:
5頭牛,3頭羊,1頭豬
新狀態:
5頭牛,3頭羊,3頭豬
增加2頭豬
原始狀態:
5頭牛,3頭羊,1頭豬
新狀態:
5頭牛,3頭羊,3頭豬
5頭牛,3頭羊,3頭豬
命令式呼叫
狀態移轉
REST與DDD
REST與DDD
35
REST以DDD中的聚合作為資源描述的單位
亦即描述聚合根的狀態變化
REST與DDD的概念轉換
REST與DDD
36
Aggregate
Relation
ID
Resource
Links
URI
解決方案的編排
REST與DDD
• 依照限界上下文以解決方案資料夾包裹
• BCI.Infrastructures和BCI.SharedCores屬於共享專案
(依照團隊討論,可考慮各種方式共享,例: Git子模組)
範例模組概觀
REST與DDD
• 模組的設計第一層可以採用聚合。好處是可以快速
理解有多少個聚合在這個限界上下文
• BCI.[限界上下文名稱:Products].Domain:
這個專案主要是放置領域物件
• BCI.[限界上下文名稱:Products].Application:
這個專案包含所有主要的商業邏輯,以及實現
BCI.Products.Domain中宣告介面的物件
深入探討核心層
• 在BCI.Domain.Products專案中,每一個聚合就是一個
資料夾
• 在聚合資料夾中包含聚合所有的領域物件
• 將資源庫的介面宣告在Interfaces資料夾中
• Specifications資料夾含有驗證Product的相關邏輯
• Policy則是針對Product整體的不可變條件(Invariant)
REST與DDD
與外部互動模型
REST與DDD
• 與外部互動的模型主要有:
• Query
• Command
• ReadModel
• Query模型是查詢相關操作的模型
• Command模型是關於資源異動操作的模型
• ReadModel模型是查詢返回用的模型
與外部互動模型
REST與DDD
• ApplicationService是主要執行使用案例的物件
• DomainService針對所有關乎領域物件操作的邏輯,且
這些邏輯無法歸屬到任何一個領域物件中。
REST與DDD
REST與DDD
• 每個聚合都是資源操作的單位
REST與DDD
REST與DDD
依循REST規範,才是真正完整的PL
關聯與REST
REST與DDD
處理關聯時,依然要注意PL
事件與DDD
領域事件
• 領域事件作為領域模型的重要部份,是領域建模的工具之一
• 用來捕獲領域中已經發生的事情
• 並非領域中所有發生的事件都要建模成領域事件,要忽略無業務價值的事件
• 領域事件是領域專家關心的
事件與DDD
從描述中捕捉
當使用在購物車點擊結算後,系統產生待付款訂單,
若支付成功,則更新訂單狀態為:已支付,
並且扣減庫存,接著推送撿貨通知資訊到撿貨中心。
事件與DDD
捕捉的關鍵
當使用在購物車點擊結算後,系統產生待付款訂單,
若支付成功,則更新訂單狀態為:已支付,
並且扣減庫存,接著推送撿貨通知資訊到撿貨中心。
狀態變化 關注度
事件與DDD
領域事件的實做
圖片資料:https://docs.microsoft.com/zh-tw/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/domain-events-design-implementation
事件與DDD
領域事件應用的概念圖
圖片資料:https://docs.microsoft.com/zh-tw/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/domain-events-design-implementation
事件與DDD
領域事件實例的模組
• 在Application中增加DomainEventHandlers的資料夾
用以放置領域事件的處理器
領域事件的實例
事件與DDD
這三個屬性是基礎必要屬性:
• EventId是作為事件本身的識別碼
• OccuredDate作為時間戳記,用以判別事件順序
• AggregateId是被承在的聚合,其識別碼
領域事件套用值物件的約束,讓事件更穩定
事件與DDD
操作、儲存領域事件
儲存事件
事件與DDD
事件在整合上的概念
事件整合限界上下文就如同RPC
事件就如同RPC的資料傳輸物件
使用領域事件不一定適合
事件與DDD
整合事件
為了避免領域事件違反單一職責原則,採用整合事件是個好主意
Aggregate A
Aggregate B
Aggregate C
Bounded Context A
Bounded Context B
領域事件
領域事件
整合事件
整合事件概念圖
事件與DDD
不同系統需要中間件的幫助
圖片資料:https://dzone.com/articles/microservices-with-cqrs-and-event-sourcing
事件與DDD
中間件工具的選擇
圖片資料:http://kuntalganguly.blogspot.com/2014/08/message-queue-comparision.html
事件與DDD

Weitere ähnliche Inhalte

Mehr von 國昭 張

20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1國昭 張
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺國昭 張
 
事件風暴-領域建模
事件風暴-領域建模事件風暴-領域建模
事件風暴-領域建模國昭 張
 
Scrum essential
Scrum essentialScrum essential
Scrum essential國昭 張
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討國昭 張
 
DDD架構設計
DDD架構設計DDD架構設計
DDD架構設計國昭 張
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析國昭 張
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0國昭 張
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js國昭 張
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇國昭 張
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試國昭 張
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享國昭 張
 
ASP.Net MVC Framework
ASP.Net MVC FrameworkASP.Net MVC Framework
ASP.Net MVC Framework國昭 張
 

Mehr von 國昭 張 (20)

20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺
 
事件風暴-領域建模
事件風暴-領域建模事件風暴-領域建模
事件風暴-領域建模
 
單元測試
單元測試單元測試
單元測試
 
Docker實務
Docker實務Docker實務
Docker實務
 
Scrum essential
Scrum essentialScrum essential
Scrum essential
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
 
Vue
VueVue
Vue
 
Docker基礎
Docker基礎Docker基礎
Docker基礎
 
DDD架構設計
DDD架構設計DDD架構設計
DDD架構設計
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析
 
前端測試
前端測試前端測試
前端測試
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js
 
React js
React jsReact js
React js
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享
 
ASP.Net MVC Framework
ASP.Net MVC FrameworkASP.Net MVC Framework
ASP.Net MVC Framework
 

8th ddd taiwan study group bounded context integration