領域驅動設計.Net實踐

甄鐳

  • 出版商: 清華大學
  • 出版日期: 2024-01-01
  • 定價: $828
  • 售價: 8.5$704
  • 語言: 簡體中文
  • 頁數: 512
  • ISBN: 7302649359
  • ISBN-13: 9787302649359
  • 相關分類: .NETDomain-Driven Design
  • 立即出貨

  • 領域驅動設計.Net實踐-preview-1
  • 領域驅動設計.Net實踐-preview-2
  • 領域驅動設計.Net實踐-preview-3
領域驅動設計.Net實踐-preview-1

買這商品的人也買了...

相關主題

商品描述

《領域驅動設計.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