領域驅動設計 .Net 實踐
甄鐳
- 出版商: 清華大學
- 出版日期: 2024-01-01
- 定價: $828
- 售價: 8.5 折 $704 (限時優惠至 2024-12-04)
- 語言: 簡體中文
- 頁數: 512
- ISBN: 7302649359
- ISBN-13: 9787302649359
-
相關分類:
.NET、Domain-Driven Design
立即出貨
買這商品的人也買了...
-
$474$450 -
$650$507 -
$352大話代碼架構 (項目實戰版)
-
$500$390 -
$580$452 -
$680$578 -
$1,000$780 -
$560$437 -
$500$390 -
$780$608 -
$714$678 -
$800$624 -
$690$538 -
$720$562 -
$980$764 -
$768$730 -
$360$342 -
$509軟件開發安全之道概念、設計與實施
-
$662深入理解軟件性能——一種動態視角
-
$260$247 -
$356React Native 移動開發實戰, 3/e
-
$850$663 -
$658Django 5 Web 應用開發實戰
-
$630$498 -
$534$507
相關主題
商品描述
《領域驅動設計.Net實踐》介紹領域驅動設計的基本概念和在.Net環境下使用領域驅動設計開發應用軟件的基本方法。全書分為3個部分:第1部分(第1~6章)介紹領域模型和如何創建與驗證領域模型;第2部分(第7~16章)介紹與領域驅動設計相關的.Net技術;第3部分(第17~26章)介紹如何以領域模型為核心構造各種類型的應用系統,並講解項目的升級和演化方法。為了幫助讀者更好地理解和應用領域驅動設計,本書選取詩詞游戲項目作為示例,貫穿全書的3個部分,引導讀者從零開始構建該項目,最終完成一個前後端分離的單頁面應用和基於微服務架構的應用。 《領域驅動設計.Net實踐》圍繞示例項目開發,介紹使用行為驅動開發輔助領域模型驗證、在開發中進行持續集成、源代碼管理和程序包發布等技術,還介紹使用成熟的DDD技術框架進行項目開發的優缺點,以及系統提升與持續改進過程中需要註意的問題。 《領域驅動設計.Net實踐》面向對領域驅動設計感興趣的開發人員,包括剛入行的程序員,只要讀者對.Net環境和C#語言有一定的瞭解就可以閱讀本書。此外,本書也適合作為高等院校和培訓機構相關專業的教學參考書。
目錄大綱
目 錄
第1部分 創建領域模型
第1章 領域驅動設計的概念 2
1.1 軟件的復雜性 2
1.2 領域驅動設計簡介 3
1.2.1 限界上下文 3
1.2.2 戰略設計 4
1.2.3 領域模型 5
1.2.4 通用語言 5
1.3 領域驅動設計使用中的難點 5
1.3.1 對軟件復雜性理解的偏差 6
1.3.2 術語的理解 6
1.3.3 技術框架問題 7
1.3.4 英語障礙 8
1.4 學習和使用領域驅動設計的一些體會 9
1.4.1 理解領域驅動設計的精髓 9
1.4.2 使用“戰略設計”規劃項目 9
1.4.3 在開發過程中使用“戰術設計” 10
1.4.4 在學習中盡量嘗試各種技術,在實踐中保持簡潔 11
1.4.5 實事求是,避免將理論當作教條 11
1.5 本書概況 11
1.5.1 本書的目標和結構 11
1.5.2 為什麽選擇.Net 12
1.5.3 本書選擇的示例 12
1.5.4 本書使用的開發環境 12
1.5.5 本書中的數據和代碼 13
1.6 本章小結 13
第2章 從零開始構建詩詞游戲 14
2.1 需求概述 14
2.2 領域、子域與限界上下文 15
2.3 限界上下文的初步確定 16
2.3.1 用戶認證上下文 18
2.3.2 詩詞游戲上下文 19
2.3.3 詩詞服務上下文 19
2.3.4 游戲管理上下文 19
2.4 限界上下文映射 19
2.4.1 各行其道 20
2.4.2 已發布語言 20
2.4.3 開放主機服務 20
2.4.4 客戶-供應商 21
2.4.5 跟隨者 21
2.4.6 防腐層 21
2.4.7 合作方式 21
2.4.8 共享內核 22
2.5 詩詞游戲上下文的通用語言 22
2.6 創建第一個版本 23
2.7 本章小結 27
第3章 理解領域模型 28
3.1 領域模型概述 28
3.2 實體 28
3.2.1 實體的基本概念 29
3.2.2 從業務概念中發現實體 31
3.2.3 實體中數據的封裝 33
3.2.4 實體中的方法 35
3.2.5 為什麽要避免“貧血”模型 37
3.3 值對象 38
3.3.1 值對象的概念 38
3.3.2 值對象的實現 39
3.3.3 在模型中使用值對象的好處 41
3.4 聚合和聚合根 42
3.5 存儲庫 43
3.5.1 存儲庫的概念 43
3.5.2 存儲庫接口示例 44
3.5.3 是否可以使用EF Core等技術代替存儲庫 46
3.5.4 構建測試用的存儲庫實現 46
3.6 領域事件 48
3.6.1 為什麽需要領域事件 48
3.6.2 領域事件的概念 49
3.6.3 在項目中增加領域事件 49
3.7 重構項目框架 57
3.8 完善詩詞服務 58
3.9 本章小結 62
第4章 領域服務與應用服務 63
4.1 第一個領域服務 63
4.2 對游戲進行優化 65
4.2.1 問題分析 65
4.2.2 設計模式的使用 66
4.2.3 解決方案 67
4.3 領域服務的引入 69
4.4 應用服務 72
4.4.1 創建游戲 73
4.4.2 游戲過程 77
4.5 領域服務與應用服務的區別 83
4.6 避免濫用領域服務 84
4.7 本章小結 84
第5章 領域模型的驗證與演化 85
5.1 領域模型構建過程回顧 85
5.2 領域模型設計需要註意的幾個問題 86
5.2.1 學習領域知識,充分溝通 86
5.2.2 分析模式與設計模式的使用 86
5.2.3 遵守軟件設計的一般規律 86
5.2.4 避免過度抽象 87
5.3 使用測試框架創建驗證領域模型的測試用例 87
5.3.1 創建測試項目 87
5.3.2 模擬對象的使用 91
5.3.3 對異常的測試 92
5.4 使用行為驅動設計工具SpecFlow驗證領域模型 93
5.4.1 行為驅動設計與領域驅動設計 94
5.4.2 使用SpecFlow驗證領域模型 94
5.5 創建控制台應用驗證領域模型 98
5.6 領域模型發布 98
5.7 領域模型的演化與持續集成 102
5.8 本章小結 103
第6章 創建基於控制台的人機游戲 104
6.1 已完成工作回顧 104
6.2 人機游戲說明 105
6.3 系統結構 105
6.4 創建應用層 106
6.5 模擬機器人作答 110
6.6 編寫客戶端 114
6.7 需要解決的問題 118
6.7.1 對象創建方式過於復雜 118
6.7.2 簡單工廠不能滿足擴展需求 119
6.7.3 應用層沒有隔離領域層 119
6.7.4 其他需要解決的問題 120
6.8 本章小結 121
第2部分 DDD .Net工具箱
第7章 DDD .Net相關技術概述 124
7.1 .Net簡介 124
7.1.1 .Net的發展簡史 124
7.1.2 .Net的版本 125
7.1.3 .Net的跨平臺支持 125
7.2 .Net功能 125
7.2.1 異步編程模式 125
7.2.2 特性 126
7.2.3 反射 128
7.2.4 委托 129
7.2.5 事件 131
7.2.6 泛型 132
7.2.7 LINQ 133
7.3 與領域驅動設計實現相關的技術框架 134
7.3.1 依賴註入框架 134
7.3.2 ORM框架 134
7.3.3 對象映射框架 135
7.3.4 實時通信框架 135
7.3.5 進程內消息框架 135
7.4 本章小結 136
第8章 依賴倒置原則、控制反轉與DDD架構 137
8.1 依賴倒置原則 137
8.1.1 概述 137
8.1.2 在設計中引入依賴倒置原則 138
8.1.3 設計期依賴與運行期依賴 140
8.1.4 依賴倒置實例 143
8.2 控制反轉 144
8.2.1 問題的提出 144
8.2.2 理解控制反轉 146
8.2.3 IoC容器 146
8.3 架構結構的轉變 146
8.4 本章小結 148
第9章 工廠與依賴註入容器 149
9.1 工廠 149
9.1.1 工廠的概念 149
9.1.2 工廠設計模式 150
9.2 依賴註入容器 151
9.2.1 問題的提出 152
9.2.2 理解依賴註入 152
9.3 .Net內置的依賴註入容器 153
9.3.1 基本使用方法 153
9.3.2 服務對象的生命周期 153
9.3.3 服務的註冊方法 154
9.3.4 多個構造函數的情況 156
9.4 依賴註入容器的使用 156
9.4.1 在控制台應用中使用依賴註入 156
9.4.2 改造簡單工廠 157
9.4.3 可插拔組件架構實現 159
9.5 使用第三方DI容器滿足高級需求 159
9.5.1 基本使用方法 160
9.5.2 屬性註入 161
9.5.3 使用基於名稱的註入改造工廠 161
9.5.4 程序集註冊 163
9.6 本章小結 163
第10章 基於關系數據庫的存儲庫實現 164
10.1 EF Core的基本功能 164
10.2 使用EF Core實現存儲庫 167
10.2.1 創建PlayerRepository 167
10.2.2 創建GameRepository 170
10.3 EF Core的深入應用 173
10.3.1 多數據庫類型支持 173
10.3.2 生產環境的數據庫部署 178
10.3.3 數據庫生成標識 182
10.3.4 Data Annotations vs Flunt API 183
10.4 在控制台應用中使用新的存儲庫 184
10.5 使用其他數據庫訪問框架實現存儲庫 185
10.5.1 存儲庫的持久層框架需要滿足的條件 185
10.5.2 Dapper 186
10.5.3 FreeSql 187
10.6 本章小結 187
第11章 存儲庫與NoSQL數據庫 188
11.1 NoSQL數據庫概述 188
11.1.1 鍵值對存儲數據庫 188
11.1.2 列存儲數據庫 188
11.1.3 文檔型數據庫 189
11.1.4 Graph數據庫 189
11.1.5 實時數據庫 189
11.2 文檔數據庫MongoDB概述 189
11.2.1 MongoDB介紹 189
11.2.2 MongoDB的安裝 190
11.2.3 MongoDB的管理 190
11.2.4 MongoDB的基本概念 191
11.2.5 MongoDB的基本數據類型 191
11.3 創建面向MongoDB的存儲庫 192
11.3.1 使用MongoDB.Driver操作MongoDB 192
11.3.2 創建存儲庫 194
11.3.3 使用依賴註入傳入MongoDB數據庫訪問對象 200
11.3.4 註意事項 201
11.4 聚合根在MongoDB中存儲與在關系數據庫中存儲的比較 202
11.5 本章小結 202
第12章 認證 203
12.1 基本概念 203
12.2 Asp.Net Core Identity 204
12.2.1 簡介 205
12.2.2 創建使用Identity的Web應用 205
12.2.3 集成Identity與詩詞游戲 207
12.2.4 Identity的配置 210
12.2.5 個性化Identity頁面 212
12.2.6 Identity的使用場景 214
12.3 基於OpenId Connect的認證服務 214
12.3.1 OAuth 2.0、OpenId和OpenId Connect介紹 214
12.3.2 使用Identity Server 4創建用戶管理和認證功能 215
12.3.3 使用Identity Server 4保護Web 應用 217
12.3.4 集成Identity Server 4與詩詞游戲 222
12.4 在實際項目中使用認證服務 222
12.4.1 單點登錄 222
12.4.2 前後端分離的應用 223
12.4.3 分佈式應用 224
12.5 本章小結 225
第13章 領域事件實現 226
13.1 領域事件的工作過程 226
13.2 觀察者模式、中介者模式與訂閱/發布模式 229
13.2.1 觀察者模式 230
13.2.2 中介者模式 231
13.2.3 訂閱/發布模式 232
13.3 使用MediatR實現領域事件發布 233
13.3.1 引入MediatR 233
13.3.2 將領域事件封裝為MediatR消息 233
13.3.3 事件總線實現 234
13.3.4 事件的接收和處理實現 237
13.3.5 事件發布 239
13.4 外部事件發布與消息中間件 240
13.5 本章小結 246
第14章 應用層開發 247
14.1 應用層概述 247
14.1.1 應用服務 247
14.1.2 數據傳輸對象 247
14.1.3 工作單元 248
14.2 應用層創建示例 249
14.2.1 控制台應用與Web應用的不同 249
14.2.2 創建新的應用層接口 252
14.2.3 應用層實現 255
14.3 創建應用層的Web API 257
14.4 引入工作單元 263
14.4.1 工作單元的定義 263
14.4.2 工作單元的實現 263
14.4.3 工作單元的使用 272
14.5 本章小結 272
第15章 使用Web API和gRPC實現限界上下文集成 273
15.1 直接訪問詩詞服務數據庫 273
15.2 使用Web API實現上下文集成 277
15.2.1 編寫詩詞服務的Web API 277
15.2.2 編寫訪問Web API的PoemService接口 280
15.2.3 測試Web API和客戶端 281
15.2.4 是否使用RESTful形式的Web API 283
15.3 使用gRPC實現限界上下文集成 284
15.3.1 RPC與gRPC 284
15.3.2 gRPC對.Net的支持 284
15.3.3 編寫gRPC PoemService服務 287
15.3.4 編寫gRPC PoemService客戶端 292
15.3.5 編寫驗證控制台程序 294
15.3.6 編寫gRPC應用的其他註意事項 296
15.3.7 gRPC重試策略的配置 297
15.4 本章小結 298
第16章 使用消息實現限界上下文集成 299
16.1 限界上下文集成方案 299
16.1.1 消息中間件的使用 299
16.1.2 創建對外發布消息的接口 300
16.1.3 創建消息接收接口 302
16.1.4 消息接收程序 302
16.2 使用RabbitMQ實現限界上下文集成 304
16.2.1 編寫消息接收端 304
16.2.2 消息發布 307
16.2.3 在控制台項目中使用配置文件 309
16.2.4 編寫接收端插件 310
16.2.5 RabbitMQ消息類型簡介 312
16.3 使用Kafka實現限界上下文集成 314
16.3.1 Kafka消息發送端的編寫 314
16.3.2 Kafka消息接收端的編寫 315
16.4 本章小結 318
第3部分 構建以領域模型為核心的應用
第17章 “戰略設計”與架構選擇 320
17.1 從業務出發規劃項目架構 320
17.1.1 問題的提出 320
17.1.2 戰略設計的作用 321
17.1.3 限界上下文之間的架構 322
17.2 示例項目的“戰略設計” 323
17.2.1 限界上下文的劃分 323
17.2.2 詩詞游戲上下文 323
17.2.3 用戶認證上下文 324
17.2.4 詩詞服務上下文 324
17.2.5 游戲管理上下文 324
17.3 與DDD相關的架構類型 324
17.3.1 分層架構 324
17.3.2 六邊形架構 324
17.3.3 洋蔥圈架構 325
17.3.4 整潔架構 326
17.4 使用架構描述、設計應用系統 327
17.4.1 總體架構 327
17.4.2 存儲庫 330
17.4.3 領域服務的擴展 331
17.4.4 領域事件發布 332
17.4.5 與其他限界上下文的集成 333
17.4.6 使用消息實現與其他限界上下文的集成 335
17.5 架構模型的總結 336
17.6 本章小結 337
第18章 構建Web單體應用 338
18.1 單體應用概述 338
18.2 需求細化 338
18.3 系統架構 340
18.4 應用層 341
18.5 使用SignalR創建實時服務 344
18.5.1 SignalR介紹 344
18.5.2 創建SignalR服務端 345
18.5.3 創建SignalR的JavaScript客戶端 347
18.5.4 創建Razor頁面 350
18.6 裝配依賴註入服務 353
18.7 運行效果和待解決的問題 354
18.8 本章小結 357
第19章 構建游戲服務 358
19.1 需求分析 358
19.2 項目搭建 360
19.3 編寫服務層 360
19.4 SignalR Hub的實現 365
19.5 定時器的引入 371
19.6 安全認證 374
19.7 使用依賴註入服務進行裝配 377
19.8 本章小結 378
第20章 單頁面客戶端 379
20.1 需求概述 379
20.2 技術方案 380
20.2.1 單頁面客戶端在架構中的位置 380
20.2.2 關鍵技術 381
20.3 前端項目構建 383
20.3.1 創建項目 383
20.3.2 使用oidc-client進行認證 386
20.3.3 訪問游戲服務的SignalR Hub 388
20.3.4 編寫客戶端邏輯 392
20.4 交互設計 393
20.4.1 交互設計原則 393
20.4.2 詩詞游戲的交互設計 394
20.4.3 運行效果 395
20.5 本章小結 398
第21章 使用.Net構建多種類型客戶端 399
21.1 概述 399
21.2 認證 400
21.2.1 IdentityModel.OidcClient介紹 400
21.2.2 控制台應用的認證功能實現 401
21.2.3 WinForm應用認證功能實現 403
21.2.4 Android移動應用的認證功能實現 408
21.3 Web API的訪問 412
21.3.1 使用HttpClient訪問Web API 412
21.3.2 控制台應用的Web API訪問 412
21.3.3 WinForm的Web API訪問 413
21.3.4 Android應用的Web API訪問 414
21.4 SignalR的訪問 415
21.4.1 SignalR的C#客戶端 415
21.4.2 控制台應用訪問SignalR Hub 416
21.4.3 WinForm訪問SignalR Hub 417
21.4.4 Android App訪問SignalR 418
21.5 客戶端交互模式與應用服務 420
21.6 本章小結 420
第22章 微服務 421
22.1 微服務簡介 421
22.1.1 基本概念 421
22.1.2 微服務的優點 422
22.1.3 使用微服務的代價 422
22.1.4 一個沒有很好設計的微服務示例 423
22.2 微服務相關的技術 423
22.2.1 容器 424
22.2.2 微服務編排 424
22.2.3 微服務相關的其他技術 424
22.3 使用微服務架構的詩詞游戲 426
22.3.1 需求分析 426
22.3.2 後端實現 427
22.3.3 前端實現 431
22.3.4 使用Docker Compose創建容器 433
22.4 容器化部署 437
22.4.1 單頁面前端的容器化部署 437
22.4.2 Asp.Net Core項目的容器化部署 437
22.4.3 基礎設施的容器化部署 439
22.4.4 詩詞游戲的容器化部署 440
22.4.5 使用反向代理服務器整合應用的各個部分 441
22.5 持續集成 443
22.5.1 持續集成簡介 443
22.5.2 手工集成過程 443
22.5.3 使用Jenkins完成自動集成 445
22.6 本章小結 447
第23章 詩詞服務數據維護——非DDD技術的限界上下文 448
23.1 數據驅動開發簡介 448
23.2 詩詞服務數據維護的開發 449
23.3 數據驅動開發與DDD的比較 453
23.4 本章小結 455
第24章 游戲管理上下文的實現與CQS模式 456
24.1 游戲管理部分的設計 456
24.2 游戲管理部分的領域模型 457
24.2.1 領域模型定義 457
24.2.2 存儲庫的實現 459
24.3 查詢部分設計 462
24.3.1 查詢接口 462
24.3.2 查詢實現 468
24.4 游戲管理服務設計 469
24.5 游戲管理客戶端設計 472
24.6 CQRS簡介 473
24.7 本章小結 474
第25章 使用成熟的DDD技術框架 475
25.1 ABP和ABP vNext 475
25.1.1 ASP.NET Boilerplate(ABP) 475
25.1.2 ABP vNext 476
25.2 使用ABP vNext開發項目 476
25.3 使用輔助工具進行開發 478
25.4 使用技術框架開發的優勢和代價 479
25.5 如何使用技術框架 480
25.6 本章小結 480
第26章 系統提升與持續改進 481
26.1 模型對需求變化的適應性 481
26.1.1 游戲類型的增加 481
26.1.2 增加不同數據源的游戲類型 483
26.1.3 限制數據範圍 484
26.2 軟件升級時模型的修改 484
26.2.1 挖掘現有模型的潛力 484
26.2.2 引入新的領域概念 486
26.3 使用語音輸入對系統的影響 488
26.4 架構的持續改進 488
26.5 本章小結 491
後記 492
附錄A 本書使用的開發工具、開發環境介紹 494
A.1 Docker 494
A.2 Git 494
A.3 NuGet 495
A.4 xUnit 495
A.5 SpecFlow 495
A.6 MongoDB 495
A.7 MS SQL Server 496
A.8 RabbitMQ 496
A.9 Kafka 497
A.10 Jenkins 500
A.11 Identity Server 4 admin 500
附錄B 參考文獻 509
附錄C 本書代碼說明 511