領域驅動設計 (Domain Driven Design)
Transcript of 領域驅動設計 (Domain Driven Design)
領域驅動設計K.NET 講師 Clark
Microsoft MVP 部落格:昏睡領域 http://www.dotblogs.com.tw/clark/ 技術專長:
◦ 領域驅動設計流程◦ 系統架構分析設計◦ 軟體框架分析設計◦ 軟韌硬體整合開發
關於我
基礎知識 需求分析 系統分析 系統設計 系統實作 持續回饋
Agenda
在各個開發階段,提供指引與方針軟體開發流程
系統分析 系統設計 系統實作
領域驅動設計
透過分層設計,聚焦領域邏輯三層式架構設計
Presentation AccessesDomain
APP Server Database
Presentation
Domain
Presentation
Domain
Presentation
Domain
Accesses Accesses Accesses
Channel9 課程連結:◦ https://channel9.msdn.com/Series/three-tier-design
點部落課程簡報:◦ https://dotblogs.com.tw/clark/2016/03/14/075524
三層式架構設計 – 課程資源
基礎知識 需求分析 系統分析 系統設計 系統實作 持續回饋
Agenda
軟體,是特定領域問題的解決方案軟體的用途
找出需求背後的問題,提供解決方案服務的專業
需求 + 問題
基礎知識 需求分析 系統分析 系統設計 系統實作 持續回饋
Agenda
提供多元面向的解決方案網路拓樸
餐廳營運系統
Azure
門店點餐平板 門店營運伺服器
餐廳營運資料庫座位RFID掃描器
門店帶位前台
釐清解決方案的使用情景使用案例
座位狀態顯示客戶入座功能
客戶餐點查詢
Timer帶位人員
自動座位安排
釐清解決方案的操作流程Prototype
京站門店帶位前台
桌號:01座位:03/04
桌號:02座位:00/04
桌號:04座位:00/04
桌號:05座位:04/04
桌號:03座位:00/02
桌號:06座位:02/02
桌號:05小籠包x1臭豆腐x2蚵仔煎x6üü
使用中
空座位
自動座位安排
釐清解決方案的功能需求功能清單工作項目 項目說明 優先順序座位狀態顯示 - 定時刷新目前座位狀態
- 座位狀態:入座數量、座位數量、入座狀態 - 入座狀態:空座位、使用中
高
客戶入座功能 - 確認客戶人數及座位後,即可安排客人入座 高客戶餐點查詢 - 帶位人員可查詢目前入座客戶的餐點訂單 低自動帶位功能 - 確認客戶人數後,系統自動計算座位安排
- 計算規則:入座空位最少、不提供併桌計算中
…… …… ………… …… ……
釐清解決方案的領域概念領域模型
門店帶位前台
門店
座位
顧客
餐點訂單
1*
*1
*1
1*
基礎知識 需求分析 系統分析 系統設計 系統實作 持續回饋
Agenda
統一領域模型的英文詞彙詞彙表
中文名詞 英文名詞 備註門店 Store座位 Seat顧客 Customer餐點訂單 Meal Order…… …… ………… …… ………… …… ……
套用詞彙表將領域模型轉為領域物件領域物件
門店帶位前台
Store
Seat
Customer
MealOrder
1*
*1
*1
1*
劃分進出系統邊界的物件顆粒切割相依: Entity
門店帶位前台
Store
Seat
Customer
MealOrder
1*
*1
*1
1*
劃分進出系統邊界的物件顆粒切割相依: Entity
門店帶位前台
Store
Seat
Customer
MealOrder
1*
*1
*1
+Id
+Id+Id
1*
建立 Entity 物件進出系統邊界的物件門戶切割相依: Repository門店帶位前台
Store
Seat
Customer
MealOrder
1*
*1
*1
+Id
+Id+Id
1*
<<inteface>>CustomerRepository
<<inteface>>SeatRepository
<<inteface>>StoreRepository
建立 Entity 物件進出系統邊界的物件門戶切割相依: Repository門店帶位前台
Store
Seat
Customer
MealOrder
1*
*1
*1
+Id
+Id+Id
1*
<<inteface>>CustomerRepository
<<inteface>>SeatRepository
<<inteface>>StoreRepository
定義 Entity 物件之間的關聯切割相依: Association門店帶位前台
Store
Seat
Customer
MealOrder
1*
*1
*1
+Id
+Id+MealOrderList
+Id
<<inteface>>CustomerRepository
<<inteface>>SeatRepository
<<inteface>>StoreRepository
定義 Entity 物件之間的關聯切割相依: Association門店帶位前台
Store
Seat
Customer
MealOrder
1*
*1
+Id+CustomerId
+Id+MealOrderList
+Id
<<inteface>>CustomerRepository
<<inteface>>SeatRepository
<<inteface>>StoreRepository
定義 Entity 物件之間的關聯切割相依: Association
門店帶位前台
Store
Seat
Customer
MealOrder
+StoreId+Id+CustomerId
+StoreId+Id+MealOrderList
+Id
<<inteface>>CustomerRepository
+GetAllByStoreId(storeId)
<<inteface>>SeatRepository
+GetAllByStoreId(storeId)
<<inteface>>StoreRepository
散落畫面欄位到 Entity
散落職責: Property門店帶位前台
Store
Seat
Customer
MealOrder+Name+Count
<<inteface>>CustomerRepository
+GetAllByStoreId(storeId)
<<inteface>>SeatRepository
+GetAllByStoreId(storeId)
<<inteface>>StoreRepository
+Id+Name
+StoreId+Id+Name+Count+State+CustomerId
+StoreId+Id+MealOrderList+Count
散落畫面功能到 Entity 、 Repository
散落職責: Method門店帶位前台
Store
Seat
Customer
MealOrder+Name+Count
<<inteface>>CustomerRepository
+AddCustomer(customer)+GetAllByStoreId(storeId)
<<inteface>>SeatRepository
+SetSeat(seat)+GetAllByStoreId(storeId)
<<inteface>>StoreRepository
+GetCurrentStore()
+Id+Name
+StoreId+Id+Name+Count+State+CustomerId
+StoreId+Id+MealOrderList+Count
散落畫面功能到 Service
散落職責: Service門店帶位前台
Store
Seat
Customer
MealOrder+Name+Count
<<inteface>>CustomerRepository
+AddCustomer(customer)+GetAllByStoreId(storeId)
<<inteface>>SeatRepository
+SetSeat(seat)+GetAllByStoreId(storeId)
<<inteface>>StoreRepository
+GetCurrentStore()
+Id+Name
+StoreId+Id+Name+Count+State+CustomerId
+StoreId+Id+MealOrderList+Count
SmartUsherService
+Usher(customer)
描述功能職責,所進行的物件交互功能交互:順序圖
門店帶位前台 - 自動帶位功能
SmartUsherService SeatRepository CustomerRepository
Usher(customer)
GetAllByStoreId(storeId)
return seatList
Distribute(customer, seatList)
SetSeat(seat)
AddCustomer(customer)
return seat
基礎知識 需求分析 系統分析 系統設計 系統實作 持續回饋
Agenda
套用 Facade 模式,簡化操作使用封裝 Context
門店帶位前台
<<inteface>>CustomerRepository
+AddCustomer(customer)+GetAllByStoreId(storeId)
<<inteface>>SeatRepository
+SetSeat(seat)+GetAllByStoreId(storeId)
<<inteface>>StoreRepository
+GetCurrentStore()
SmartUsherService
+Usher(customer)
UsherContext+StoreRepository+SeatRepository+CustomerRepository+SmartUsherService
選用 DI Framework ,填充 Context 內容注入 Context
門店帶位前台
<<inteface>>CustomerRepository
+AddCustomer(customer)+GetAllByStoreId(storeId)
<<inteface>>SeatRepository
+SetSeat(seat)+GetAllByStoreId(storeId)
<<inteface>>StoreRepository
+GetCurrentStore()
SmartUsherService
+Usher(customer)
UsherContext+StoreRepository+SeatRepository+CustomerRepository+SmartUsherService
DI Framework
SQLStoreRepository
SQLSeatRepository
SQLCustomerRepository
<<create>> <<create>> <<create>>
<<create>>
DI Framework
基礎知識 需求分析 系統分析 系統設計 系統實作 持續回饋
Agenda
持續回饋問題,完整封裝領域知識回饋模型
問題反饋
領域模型領域知識 領域物件
Q & A領域驅動設計
K.NET 講師 Clark