《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》系統(tǒng)介紹軟件的設計思想、架構和開發(fā)模式,帶領讀者快速建立軟件開發(fā)的知識體系,另外還詳細介紹基于ASP.NET Core的項目案例開發(fā),幫助讀者全面掌握如何快速開發(fā)高效、穩(wěn)定的Web應用程序。
《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》共10章,分為2篇。第1篇軟件開發(fā)內(nèi)功心法,首先介紹軟件設計思想、軟件架構、面向對象編程的六大原則和設計模式等知識,為軟件開發(fā)初學者晉級打好基礎,然后簡要介紹一個電商項目的概況和架構設計,為后續(xù)的項目開發(fā)實踐做好鋪墊。第2篇領域驅動設計落地,首先介紹領域驅動設計的思想與方法,然后通過一個電商項目案例的開發(fā)實踐,展現(xiàn)以領域模型為核心的Web應用程序的完整開發(fā)過程,包括基礎設施層的實現(xiàn)、應用程序層的實現(xiàn)和展示層的實現(xiàn)等,后對MVC架構做詳細介紹,這些內(nèi)容展現(xiàn)了高品質(zhì)軟件開發(fā)的核心價值和面向對象程序設計的思想價值。
《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》理論結合實踐,講解深入淺出,適合有一定C#語言基礎的Web開發(fā)人員閱讀,尤其適合想要建立軟件開發(fā)知識體系并提高開發(fā)水平的Web程序員閱讀。另外,《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》還可以作為相關培訓機構的教材。
以架構和模式為起點,深入介紹應用軟件開發(fā)的思想和方法
通過一個Web項目,詳解領域驅動設計的支撐技術和落地過程
從軟件的設計思想、架構和開發(fā)模式的角度詳解Web應用開發(fā)
通過一個電商項目案例,展現(xiàn)基于ASP.NET Core的Web應用開發(fā)的完整流程
將軟件設計思想和項目實踐相結合,詳解如何開發(fā)一個高效、穩(wěn)定的Web應用系統(tǒng)
全面、深入地介紹領域驅動設計的核心思想及其支撐技術
Web應用程序是企業(yè)應用開發(fā)的主流領域之一,它一般采用客戶端-服務器架構,用戶在客戶端的瀏覽器上進行人機交互,而重要的邏輯和數(shù)據(jù)計算則在服務器上進行。隨著移動互聯(lián)網(wǎng)的普及,手機App逐漸興盛,它比Web應用程序有更好的用戶體驗,在使用的靈活性上也遠超Web應用程序,以至于出現(xiàn)了手機App會代替Web應用程序的說法。但這種說法忽略了一個事實:一個軟件,尤其是企業(yè)應用軟件,其核心在于解決問題的領域模型。從這個角度看,手機App和Web應用程序的區(qū)別僅僅在于人機交互方式的不同,手機App同樣采用客戶端-服務器架構,這和Web應用程序一樣,其有價值的核心代碼仍然運行在服務器上。事實上,手機App和Web應用往往使用的是同一個服務器。
隨著物聯(lián)網(wǎng)技術的發(fā)展,軟件的交互方式更加豐富,很多聯(lián)網(wǎng)的硬件可以和軟件系統(tǒng)進行交互,而不僅限于人機交互。這些智能硬件作為新的交互方式將會大大改變軟件的模式。手機App和Web應用程序作為流行的交互方式,將與智能硬件交互方式共存。交互方式本質(zhì)上也是企業(yè)應用中流程控制的一種方式,就算Web應用程序會進化到所謂的流程嵌入軟件的程度,運行在服務器端的越來越復雜的領域模型代碼也不會改變。
開發(fā)一個功能強大、性能穩(wěn)定、使用靈活和易擴展的Web應用程序離不開編程語言的支持,更離不開軟件工程的支持。如果說軟件產(chǎn)品是現(xiàn)實的抽象,那么軟件工程就是抽象的抽象,或者說是對軟件開發(fā)過程和解決方案的提煉與重用。對于開發(fā)人員而言,編程語言是基礎,但其對軟件工程的理解程度決定了他所開發(fā)的軟件的質(zhì)量?梢哉f軟件工程的重要性要遠大于編程語言本身,畢竟軟件是思想的產(chǎn)物,而語言只是表達思想的手段。
目前,已經(jīng)出版的Web開發(fā)類圖書大多都把重點放在了Web框架的使用和項目的編碼實現(xiàn)上,而鮮見一本從軟件的設計思想、架構和開發(fā)模式的角度講解Web開發(fā)的圖書。這便是筆者寫作《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》的原因。《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》將帶領讀者快速建立軟件開發(fā)的知識體系,了解基于ASP.NET Core的項目案例的開發(fā)過程,從而幫助讀者系統(tǒng)地學習開發(fā)高效、穩(wěn)定的Web應用程序所需要掌握的知識。
《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》特色
- 不局限于Web框架的介紹,而是以架構和模式為起點,全面介紹應用軟件解決問題的思路和方法。這些思路和方法是新入職開發(fā)人員所缺乏的,也是他們職業(yè)晉級所的。
- 通過一個Web應用項目案例,詳細介紹領域驅動設計的落地過程和支撐技術,這對于Web應用開發(fā)人員而言有較高的參考價值。
- 用理論結合實戰(zhàn)的方式進行講解,幫助讀者快速掌握項目開發(fā)的相關知識和技巧。
- 《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》的項目案例源代碼具有較高的工程應用價值,讀者稍加修改即可用于自己的項目開發(fā)中。
《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》內(nèi)容
第1篇 軟件開發(fā)內(nèi)功心法
第1章主要介紹開發(fā)一個軟件項目需要面對的幾個問題,包括領域模型的創(chuàng)建、架構的選擇、軟件框架的使用和數(shù)據(jù)存儲的實現(xiàn)。
第2章主要介紹軟件的發(fā)展歷程,以及幾種主流編程規(guī)范的特點和它們在描述問題、解決問題時的思想。其中,重點介紹面向對象和面向組件的編程思想,這是后續(xù)章節(jié)中要頻繁使用的。
第3章圍繞軟件架構展開,主要介紹架構的概念、意義和描述架構的4 1視圖,并介紹幾種Web應用的常用架構,以及它們之間的演進過程。
第4章主要介紹面向對象程序設計的六大原則和設計模式的相關知識,這些原則用于指導開發(fā)人員在面向對象的程序設計中避免錯誤的選擇,而更具象的設計模式則是這些原則的實際應用。
第5章介紹項目案例iShopping的背景知識,以及如何用4 1視圖設計和描述項目架構。該項目是用流行的ASP.NET Core框架實現(xiàn)的,它是一款非常典型的企業(yè)級Web應用。
第2篇 領域驅動設計落地
第6章介紹領域驅動設計的工具,以及組成領域模型的基本元素的概念和意義。
第7章介紹如何綜合運用第6章中介紹的工具和元素創(chuàng)建項目案例的領域模型。
第8~10章分別對iShopping系統(tǒng)的基礎設施層、應用程序層和UI層的實現(xiàn)展開講解,展示一個Web應用程序的完整實現(xiàn)過程。
配套資源獲取方式
《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》項目案例的完整源代碼需要讀者自行下載。請在華章公司的網(wǎng)站(www.hzbook.com)上搜索到《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》,然后單擊資料下載按鈕,即可在《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》頁面上找到下載鏈接。另外,讀者還可以通過https://e.coding.net/ishopping/ishopping/iShopping.git網(wǎng)站進行獲取。
讀者對象
《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》適合以下讀者閱讀:
- 有一定C#基礎的Web開發(fā)人員;
- 想提升Web項目開發(fā)水平的程序員;
- Web開發(fā)項目經(jīng)理;
- 高校相關專業(yè)的學生;
- 相關培訓機構的學員。
《Web開發(fā)者晉級之道:架構、模式和領域驅動設計》意在幫助新入行的軟件開發(fā)人員和編程愛好者快速了解和掌握基于ASP.NET Core 的Web應用程序開發(fā)技術。閱讀本書需要讀者具備基本的C#語言基礎和面向對象程序設計的基礎知識。另外,建議讀者對統(tǒng)一建模語言(Unified Modeling Language,UML)也要有所了解,這有助于更好地理解書中的模型。
致謝
編寫本書遇到的困難遠超筆者的想象。如果沒有家人和朋友的支持,很難想象筆者能完成這本書的寫作。在此首先要感謝筆者的家人,在編寫本書的一年多的時間里,筆者陪伴他們太少。另外還要感謝參與本書出版的編輯,他們一次次不厭其煩地幫我出謀劃策并細心地修改書稿,才得以讓本書順利出版。后感謝讀者朋友們,本書因你們而有價值。
……
王西友 現(xiàn)供職于徐工集團,任主任設計師和特聘高級技術專家。多年以來一直從事智能控制和信息化軟件的開發(fā)工作,在軟件架構、設計模式和領域驅動設計方面有深厚的理論功底和豐富的開發(fā)經(jīng)驗。
前言
第1篇 軟件開發(fā)內(nèi)功心法
第1章 如何開始一個軟件項目 2
1.1 軟件項目開發(fā)面臨的挑戰(zhàn) 2
1.1.1 領域模型的創(chuàng)建 3
1.1.2 架構的選擇 4
1.1.3 軟件框架的使用 5
1.1.4 數(shù)據(jù)存儲的實現(xiàn) 6
1.2 小結 6
第2章 軟件如何解決問題 7
2.1 軟件的發(fā)展歷程 7
2.1.1 面向過程的編程 8
2.1.2 面向對象的編程 9
2.1.3 面向組件的編程 16
2.1.4 面向方面的編程 19
2.1.5 綜述 21
2.2 對象的意義 21
2.2.1 對象和類型 22
2.2.2 對象的創(chuàng)建和生命周期的控制 23
2.2.3 對象的依賴 26
2.3 組件 26
2.3.1 接口與實現(xiàn)分離 27
2.3.2 接口分解 30
2.3.3 接口的多重實現(xiàn)與繼承 33
2.3.4 接口與契約式編程 34
2.4 小結 35
第3章 軟件架構 36
3.1 軟件架構概述 36
3.1.1 軟件架構的定義 36
3.1.2 軟件架構風格和架構模式 38
3.1.3 4 1視圖 40
3.2 主流軟件架構簡介 41
3.2.1 分層架構 41
3.2.2 MVC架構 45
3.2.3 REST架構 47
3.2.4 微服務架構 52
3.3 小結 54
第4章 面向對象的設計模式和原則 55
4.1 重用 55
4.1.1 繼承重用 56
4.1.2 組合重用 60
4.1.3 模式重用 62
4.2 面向對象的設計原則 63
4.2.1 單一職責原則 63
4.2.2 開閉原則 65
4.2.3 里氏代換原則 67
4.2.4 依賴倒置原則 71
4.2.5 接口隔離原則 73
4.2.6 迪米特法則 75
4.3 設計模式 79
4.3.1 設計模式的定義 80
4.3.2 設計模式的分類和應用 80
4.3.3 如何使用設計模式 81
4.4 小結 81
第5章 項目概況與架構設計 83
5.1 iShopping項目 83
5.1.1 項目簡介 83
5.1.2 用Java還是.NET Core 84
5.1.3 集成開發(fā)環(huán)境 85
5.2 iShopping的架構設計 86
5.2.1 領域驅動設計和邏輯視圖 86
5.2.2 開發(fā)視圖 88
5.2.3 進程視圖 89
5.2.4 物理視圖 91
5.2.5 場景視圖 92
5.3 小結 93
第2篇 領域驅動設計落地
第6章 領域模型 96
6.1 領域驅動設計 96
6.2 領域對象的識別與創(chuàng)建 98
6.2.1 實體對象 99
6.2.2 實體對象的標識和替換 104
6.2.3 值對象 108
6.2.4 用值對象封裝復雜的邏輯 114
6.3 整體設計 124
6.3.1 領域的劃分 125
6.3.2 限界上下文 127
6.3.3 限界上下文的映射 128
6.4 聚合 142
6.4.1 聚合對象 142
6.4.2 使用聚合對象實現(xiàn)限界上下文 143
6.4.3 聚合對象之間的導航 151
6.4.4 聚合內(nèi)部對象的實現(xiàn)和引用 156
6.5 領域服務對象 157
6.5.1 領域服務 158
6.5.2 領域服務和應用服務 160
6.5.3 領域服務與貧血模型 161
6.6 領域事件 163
6.6.1 領域事件簡介 164
6.6.2 領域事件的發(fā)布和訂閱 166
6.7 領域對象的生命周期 176
6.7.1 工廠和構建器 176
6.7.2 倉儲對象 179
6.8 小結 182
第7章 綜合運用領域模型 183
7.1 商品目錄上下文的實現(xiàn) 183
7.1.1 商品分類聚合的實現(xiàn) 184
7.1.2 商品聚合的實現(xiàn) 192
7.2 訂單上下文的實現(xiàn) 202
7.2.1 購物車聚合的實現(xiàn) 204
7.2.2 訂單聚合的實現(xiàn) 210
7.2.3 訂單優(yōu)惠聚合的實現(xiàn) 224
7.2.4 訂單費用計算服務的實現(xiàn) 229
7.3 小結 232
第8章 基礎設施層的實現(xiàn) 233
8.1 基礎設施層的創(chuàng)建 233
8.2 數(shù)據(jù)存儲 234
8.2.1 數(shù)據(jù)庫設計范式 235
8.2.2 事務 238
8.2.3 NoSQL數(shù)據(jù)庫 240
8.3 對象關系映射 241
8.3.1 對象-數(shù)據(jù)庫阻抗失配 241
8.3.2 對象關系映射的困難 242
8.3.3 傳統(tǒng)的數(shù)據(jù)訪問技術ADO.NET 243
8.4 Entity Framework Core框架 247
8.4.1 Entity Framework Core的引用 247
8.4.2 Entity Framework Core簡介 249
8.4.3 實現(xiàn)自定義數(shù)據(jù)上下文 252
8.4.4 實現(xiàn)對象倉儲 270
8.5 MongoDB應用 280
8.5.1 MongoDB數(shù)據(jù)庫 281
8.5.2 使用MongoDB實現(xiàn)對象倉儲 283
8.6 RabbitMQ應用 287
8.6.1 RabbitMQ的安裝和配置 288
8.6.2 使用RabbitMQ實現(xiàn)事件總線 290
8.7 使用第三方WebAPI 297
8.7.1 WebAPI訪問技術 297
8.7.2 使用WebAPI實現(xiàn)運輸距離的計算 300
8.8 小結 303
第9章 應用程序層的實現(xiàn) 304
9.1 應用程序層簡介 304
9.1.1 應用程序層和應用服務 306
9.1.2 應用服務的接口形式 310
9.1.3 CQRS風格的應用服務 312
9.1.4 事件存儲 317
9.2 實現(xiàn)查詢的方法 319
9.2.1 對象的映射 319
9.2.2 查詢過濾器 321
9.2.3 數(shù)據(jù)代理 327
9.2.4 查詢門面 334
9.3 小結 341
第10章 展示層和MVC框架 342
10.1 ASP.NET Core MVC框架 342
10.1.1 路由 343
10.1.2 MVC簡介 346
10.1.3 控制器 349
10.1.4 控制器和領域模型 352
10.1.5 視圖和模型 354
10.1.6 OWIN和反向代理 358
10.2 ASP.NET Core MVC項目 361
10.2.1 搭建MVC 362
10.2.2 依賴注入容器 367
10.2.3 搭建前端開發(fā)框架 371
10.3 控制器和視圖的實現(xiàn) 372
10.3.1 控制器和視圖 373
10.3.2 視圖的表單提交 377
10.3.3 視圖與服務器的異步通信 379
10.4 小結 382
……