目錄
序xix
前言xxi
致謝xxxi
關於作者xxxv
如何使用本書xxxvii
第1章DDD入門1
我能DDD嗎?2
為什麼我們需要DDD 5
如何DDD 17
使用DDD的業務價值22
1你獲得了一個非常有用的領域模型22
2你的業務得到了更準確的定義和理解23
3領域專家可以為軟件設計做出貢獻23
4更好的用戶體驗23
5清晰的模型邊界24
6更好的企業架構24
7敏捷、迭代式和持續建模24
8使用戰略和戰術新工具24
實施DDD所面臨的挑戰25
虛構的案例,真實的實踐33
本章小結36
第2章領域、子域和限界上下文37
總覽37
工作中的子域和限界上下文38
將關注點放在核心域上42
戰略設計為什麼重要45
現實世界中領域和子域48
x目錄
理解限界上下文53
限界上下文不僅僅只包含模型57
限界上下文的大小59
與技術組件保持一致61
示例上下文62
協作上下文63
身份與訪問上下文69
敏捷項目管理上下文71
本章小結73
第3章上下文映射圖75
上下文映射圖為什麼重要75
繪製上下文映射圖77
產品和組織關係79
映射3個示例限界上下文82
本章小結97
第4章架構99
採訪一個成功的CIO100
分層104
依賴倒置原則107
六邊形架構(端口與適配器) 110
面向服務架構114
REST 117
REST作為一種架構風格117
RESTful HTTP服務器的關鍵方面118
RESTful HTTP客戶端的關鍵方面119
REST和DDD 120
為什麼是REST?121
命令和查詢職責分離――CQRS121
CQRS的各個方面123
處理具有最終一致性的查詢模型128
事件驅動架構129
目錄xi
管道和過濾器131
長時處理過程(也叫Saga) 134
事件源140
數據網織和基於網格的分佈式計算143
數據複製144
事件驅動網織和領域事件145
持續查詢145
分佈式處理146
本章小結148
第5章實體149
為什麼使用實體149
唯一標識151
用戶提供唯一標識152
應用程序生成唯一標識153
持久化機制生成唯一標識156
另一個限界上下文提供唯一標識160
標識生成時間161
委派標識163
標識穩定性165
發現實體及其本質特徵167
揭開實體及其本質特徵的神秘面紗168
挖掘實體的關鍵行為172
角色和職責176
創建實體181
驗證183
跟踪變化192
本章小結192
第6章值對象193
值對象的特徵194
度量或描述195
不變性195
xii目錄
概念整體196
可替換性199
值對象相等性200
無副作用行為201
最小化集成204
用值對象表示標準類型206
測試值對象210
實現214
持久化值對象219
拒絕由數據建模洩漏帶來的不利影響220
ORM與單個值對象221
多個值對象序列化到單個列中224
使用數據庫實體保存多個值對象225
使用聯合表保存多個值對象229
ORM與枚舉狀態對象230
本章小結233
第7章領域服務235
什麼是領域服務(首先,什麼不是領域服務) 237
請確定你是否需要一個領域服務238
建模領域服務241
獨立接口有必要嗎244
一個計算過程246
轉換服務249
為領域服務創建一個迷你層250
測試領域服務250
本章小結253
第8章領域事件255
何時/為什麼使用領域事件255
建模領域事件258
創建具有聚合特徵的領域事件263
身份標識264
目錄xiii
從領域模型中發布領域事件265
發送方265
訂閱方269
向遠程限界上下文發布領域事件271
消息設施的一致性271
自治服務和系統272
容許時延273
事件存儲274
轉發存儲事件的架構風格279
以REST資源的方式發布事件通知279
通過消息中間件發布事件通知283
實現284
發布NotificationLog 285
發布基於消息的事件通知290
本章小結297
第9章模塊299
通過模塊完成設計299
模塊的基本命名規範302
領域模型的命名規範302
敏捷項目管理上下文中的模塊305
其他層中的模塊308
先考慮模塊,再是限界上下文309
本章小結310
第10章聚合311
在Scrum核心領域中使用聚合312
第一次嘗試:臃腫的聚合313
第二次嘗試:多個聚合314
原則:在一致性邊界之內建模真正的不變條件317
原則:設計小聚合319
不要相信每一個用例321
原則:通過唯一標識引用其他聚合322
xiv目錄
通過標識引用使多個聚合協同工作324
建模對象導航性325
可伸縮性和分佈式326
原則:在邊界之外使用最終一致性327
誰的任務?328
打破原則的理由329
理由之一:方便用戶界面329
理由之二:缺乏技術機制330
理由之三:全局事務331
理由之四:查詢性能331
遵循原則332
通過發現,深入理解332
重新思考設計332
估算聚合成本334
常見用例場景335
內存消耗336
探索另外的設計337
實現最終一致性338
這是Scrum團隊成員的任務嗎?339
決定的時候到了341
實現341
創建具有唯一標識的根實體342
優先使用值對象343
使用迪米特法則和“告訴而非詢問”原則344
樂觀並發346
避免依賴注入348
本章小結349
第11章工廠351
領域模型中的工廠351
聚合根中的工廠方法352
創建CalendarEntry實例353
創建Discussion實例357
目錄xv
領域服務中的工廠358
本章小結361
第12章資源庫363
面向集合資源庫364
Hibernate實現369
TopLink實現377
面向持久化資源庫379
Coherence實現381
MongoDB實現386
額外的行為391
管理事務393
警告397
類型層級397
資源庫vs數據訪問對象(DAO) 400
測試資源庫401
以內存實現進行測試404
本章小結407
第13章集成限界上下文409
集成基礎知識409
分佈式系統之間存在根本性區別411
跨系統邊界交換信息411
通過REST資源集成限界上下文417
實現REST資源418
使用防腐層實現REST客戶端421
通過消息集成限界上下文428
從Scrum的產品負責人和團隊成員處得到持續通知428
你能處理這樣的職責嗎?434
長時處理過程,以及避免職責439
長時處理過程的狀態機和超時跟踪器450
設計一個更複雜的長時處理過程460
xvi目錄
當消息機製或你的系統不可用時464
本章小結465
第14章應用程序467
用戶界面469
渲染領域對象470
渲染數據傳輸對象471
使用調停者發布聚合的內部狀態471
通過領域負載對象渲染聚合實例472
聚合實例的狀態展現473
用例優化資源庫查詢474
處理不同類型的客戶端474
渲染適配器以及處理用戶編輯475
應用服務478
示例應用服務478
解耦服務輸出485
組合多個限界上下文487
基礎設施489
企業組件容器490
本章小結494
附錄A聚合與事件源:A+ES 495
應用服務內部496
命令處理器505
Lambda語法508
並發控制510
A+ES所帶來的結構自由性513
性能513
實現事件存儲516
關係型持久化520
BLOB持久化522
專注的聚合523
讀模型投射524
目錄xvii
與聚合設計一道使用527
增強事件527
工具和模式529
事件序列器530
事件不變性531
值對象531
協議生成534
單元測試和需求規範535
事件源和函數式語言536
參考文獻539
當然,對於“當……的時候,請通知我”,這裡的通知本身並不能構成一個事件,而只是表明我們需要向外界發出通知。另外,領域專家可能還會說“如果發生這樣的事情,它並不重要;如果發生那樣的事情,它就很重要了(將“這樣”和“那樣”用你自己領域中的事件予以替換) 。”根據你的組織文化,可能還有更多的事件用語。
牛仔的邏輯
有時,從領域專家的話中,我們看不出領域事件的跡象,但是業務需求依然有可能需要領域事件。領域專家有可能意識不到這些需求,只有在跨團隊討論之後他們才能意識到這些。發生這樣的事情往往是由於領域事件需要發佈到外部系統中,比如發佈到另一個限界上下文中(2)。由於這樣的事件由訂閱方處理,它將對本地和遠程上下文產生深遠的影響。
領域專家和領域事件
雖然領域專家在起初可能意識不到所有類型的領域事件,但是通過討論之後,他們是應該能夠了解到其中的原因的。當團隊成員對領域事件達成一致之後,領域事件便是通用語言的正式組成部分了。
當領域事件到達目的地之後一一無論是本地系統還是外部系統一一我們通常都將領域事件用於維護事件的一致性。這是有意而為之的,並且是根據設計而來的。這樣可以消除兩階段提交(全局事務),還可以支持聚合(10)原則。聚合的其中一個原則是,在單個事務中,只允許對一個聚合實例進行修改,由此產生的其他改蠻必須存單獨的事務中完成。
……
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。