埃斯波西托(DinoEsposito);軟件架構是一系列相關的抽象模式,用于指導大型軟件系統各個方面的設計。本書就是一個關于軟件架構的堅實、可重用且易于訪問的知識庫。
本書分4個部分來介紹軟件架構相關的內容。其中,基礎知識部分為軟件架構打下基礎;設計架構部分關注表現層和業務層;支撐架構部分涵蓋3個可用于構建各種子領域的支撐架構;基礎設計部分介紹了多樣化持久化、NoSQL數據存儲、SQL、EntityFramework和關系型數據庫等內容。
本書著重介紹軟件架構相關的內容,適合軟件架構師和想成為軟件架構師的人閱讀,而且首席開發者和各種.NET應用程序的開發者也能從本書獲益。
Dino Esposito,是知名的Web和移動開發專家,寫過多本暢銷書,包括
《Architecting Mobile Solutions for the Enterprise》和《Programming Microsoft ASP.NETMVC》。除了寫作和演講,他還是一家軟件和IT服務公司的創始人和CTO,這家公司服務于職業體育產業。
Andrea Saltarello,是一家軟件設計和開發咨詢公司的CEO、創始人和解決方案架構師。他是一名活躍的演講者和培訓師,也是一個開源項目的首席開發者,該項目專注于開發ASP.NETMVC工具套件的擴展功能。
第1部分基礎
第1章今天的架構師和架構2
1.1軟件架構到底是什么2
1.1.1把架構原則應用到軟件中3
1.1.2確認需求5
1.1.3什么是架構,什么不是8
1.1.4架構流程10
1.2誰是架構師12
1.2.1架構師的職責12
1.2.2架構師的角色14
1.2.3關于架構師的常見誤解15
1.3總結17
1.4笑到17
第2章為成功而設計18
2.1"大泥球"18
2.1.1"大泥球"的成因19
2.1.2"大泥球"的征兆21
2.1.3使用指標檢測BBM23
2.2軟件項目的機制24
2.2.1組織文化24
2.2.2幫助團隊更好地寫代碼26
2.3走出混亂29
2.3.1有一種奇怪的東西叫作"遺留代碼"30
2.3.2在3招之內將殺(checkmate)30
2.3.3決定是否添加人手33
2.4總結34
2.5笑到35
第3章軟件設計的原則36
3.1軟件設計的通用原則36
3.1.1從意大利面代碼到千層餅代碼37
3.1.2關注點分離38
3.1.3隔離39
3.2面向對象設計39
3.2.1相關類40
3.2.2對接口編程40
3.2.3組合與繼承42
3.2.4反思面向對象.43
3.3開發和設計向量44
3.3.1SOLID原則44
3.3.2處理依賴的模式48
3.3.3編碼向量50
3.3.4使用模式52
3.4防御性編程54
3.4.1"如果—那么—拋出"模式55
3.4.2軟件契約55
3.5總結59
3.6笑到59
第4章編寫品質軟件60
4.1編寫可測試代碼的藝術60
4.1.1什么是可測試性61
4.1.2測試你的軟件62
4.1.3軟件測試的常見實踐69
4.2代碼可擴展性的實踐73
4.2.1基于接口的設計74
4.2.2插件架構74
4.2.3狀態機74
4.3寫出別人看得懂的代碼74
4.3.1把可讀性看作軟件特性75
4.3.2一些改善可讀性的實用規則77
4.4總結79
4.5笑到79
第2部分設計架構
第5章發現領域架構82
5.1領域驅動設計的真正附加價值82
5.1.1DDD里有什么為我所用83
5.1.2使用DDD開展分析83
5.1.3策略模型設計84
5.2統一語言85
5.2.1統一語言的目的85
5.2.2統一語言的結構86
5.2.3如何定義統一語言86
5.2.4保持語言與模型同步87
5.3綁定上下文88
5.3.1發現上下文88
5.3.2把領域分割成綁定上下文89
5.3.3上下文映射91
5.3.4給予每個上下文它自己的架構92
5.4分層架構94
5.4.1分層架構的起源94
5.4.2表現層96
5.4.3應用程序層96
5.4.4領域層98
5.4.5基礎設施層98
5.5總結98
5.6笑到99
第6章表現層100
6.1用戶體驗優先100
6.1.1關注交互101
6.1.2用戶體驗不是用戶界面102
6.1.3如何創建有效的體驗104
6.2真實場景107
6.2.1ASP.NET網站107
6.2.2WebForms與ASP.NETMVC111
6.2.3給網站添加設備支持113
6.2.4單頁應用程序117
6.2.5桌面富客戶端120
6.3總結122
6.4笑到122
第7章神秘的業務層123
7.1用來組織業務邏輯的模式123
7.1.1CRUD童話與架構白馬王子124
7.1.2事務腳本模式124
7.1.3領域模型模式127
7.1.4貧血領域模型(反)模式128
7.2把焦點從數據移到任務129
7.2.1ASP.NETMVC里的任務編排130
7.2.2在領域里編排任務133
7.3跨越邊界傳輸數據134
7.3.1分層架構里的數據流134
7.3.2共享領域模型實體135
7.3.3使用數據傳輸對象136
7.4總結138
7.5笑到138
第3部分支撐架構
第8章領域模型導論140
8.1從數據到行為的轉變140
8.1.1模型和領域背后的基本原理140
8.1.2數據庫是基礎設施142
8.2領域層的內部143
8.2.1領域模型143
8.2.2聚合145
8.2.3領域服務150
8.2.4領域事件152
8.2.5橫切關注點155
8.3總結157
8.4笑到157
第9章實現領域模型158
9.1在線商店示例項目158
9.1.1入選的用例158
9.1.2入選的方案159
9.1.3"買買買"項目的結構160
9.1.4入選的技術161
9.1.5在線商店的綁定上下文162
9.1.6"買買買"應用程序的上下文映射163
9.2領域建模實用指南164
9.2.1行為是游戲規則的變革者164
9.2.2實體的基架166
9.2.3值對象的基架169
9.2.4標識聚合172
9.2.5持久化模型179
9.3實現業務邏輯182
9.3.1查找訂單183
9.3.2下訂單183
9.3.3忠誠卡(或客戶忠誠計劃)187
9.4總結187
9.5笑到187
第10章CQRS導論188
10.1分離命令與查詢188
10.1.1CQRS模式概論189
10.1.2CQRS的好處190
10.1.3在業務層里使用CQRS191
10.1.4CQRS總能勝任架構需要193
10.2查詢棧194
10.2.1讀取領域模型194
10.2.2設計只讀模型外觀196
10.2.3分層表達式樹198
10.3命令棧202
10.3.1回到表現層203
10.3.2規范化命令和事件205
10.3.3處理命令和事件207
10.3.4現成的存儲212
10.4總結214
10.5笑到214
第11章實現CQRS215
11.1CQRS的實現215
11.1.1普通簡單的CQRS215
11.1.2具有命令架構的CQRS217
11.2實現查詢棧219
11.2.1創建讀取外觀219
11.2.2為調用方打包數據220
11.3實現命令棧224
11.3.1奠定基礎224
11.3.2通過命令編排用例227
11.4總結230
11.5笑到230
第12章事件溯源導論231
12.1事件的突破231
12.1.1下一件大事(重裝上陣)231
12.1.2現實世界不僅有模型,還有事件232
12.1.3拋棄"最近已知的正常狀態"232
12.1.4事件對軟件架構的深刻影響234
12.2事件源架構236
12.2.1持久化事件236
12.2.2回放事件238
12.3總結240
12.4笑到240
第13章實現事件溯源241
13.1事件溯源:為何以及何時241
13.1.1為什么說事件溯源是一個資源242
13.1.2事件溯源何時合適243
13.2帶有回放的事件溯源244
13.2.1現場比分系統244
13.2.2系統的實現246
13.3帶有聚合快照的事件溯源255
13.3.1迷你企業資源規劃系統256
13.3.2系統的實現257
13.4總結2617
13.5笑到261
第4部分基礎設施
第14章持久層264
14.1持久層概覽264
14.1.1持久層的職責264
14.1.2倉儲模式的設計265
14.2實現倉儲268
14.2.1倉儲的查詢部分268
14.2.2持久化聚合271
14.2.3存儲技術272
14.3為何你該考慮非關系型存儲275
14.3.1熟悉NoSQL276
14.3.2你會得到什么,又會失去什么277
14.3.3做出一個正確的選擇280
14.4總結282
14.5笑到282