Web應(yīng)用程序是企業(yè)應(yīng)用開發(fā)的主流領(lǐng)域之一,它一般采用客戶端-服務(wù)器架構(gòu),用戶在客戶端的瀏覽器上進行人機交互,而重要的邏輯和數(shù)據(jù)計算則在服務(wù)器上進行。隨著移動互聯(lián)網(wǎng)的普及,手機App逐漸興盛,它比Web應(yīng)用程序有更好的用戶體驗,在使用的靈活性上也遠超Web應(yīng)用程序,以至于出現(xiàn)了手機App會代替Web應(yīng)用程序的說法。但這種說法忽略了一個事實:一個軟件,尤其是企業(yè)應(yīng)用軟件,其核心在于解決問題的領(lǐng)域模型。從這個角度看,手機App和Web應(yīng)用程序的區(qū)別僅僅在于人機交互方式的不同,手機App同樣采用客戶端-服務(wù)器架構(gòu),這和Web應(yīng)用程序一樣,其有價值的核心代碼仍然運行在服務(wù)器上。事實上,手機App和Web應(yīng)用往往使用的是同一個服務(wù)器。
隨著物聯(lián)網(wǎng)技術(shù)的發(fā)展,軟件的交互方式更加豐富,很多聯(lián)網(wǎng)的硬件可以和軟件系統(tǒng)進行交互,而不僅限于人機交互。這些智能硬件作為新的交互方式將會大大改變軟件的模式。手機App和Web應(yīng)用程序作為流行的交互方式,將與智能硬件交互方式共存。交互方式本質(zhì)上也是企業(yè)應(yīng)用中流程控制的一種方式,就算Web應(yīng)用程序會進化到所謂的流程嵌入軟件的程度,運行在服務(wù)器端的越來越復(fù)雜的領(lǐng)域模型代碼也不會改變。
開發(fā)一個功能強大、性能穩(wěn)定、使用靈活和易擴展的Web應(yīng)用程序離不開編程語言的支持,更離不開軟件工程的支持。如果說軟件產(chǎn)品是現(xiàn)實的抽象,那么軟件工程就是抽象的抽象,或者說是對軟件開發(fā)過程和解決方案的提煉與重用。對于開發(fā)人員而言,編程語言是基礎(chǔ),但其對軟件工程的理解程度決定了他所開發(fā)的軟件的質(zhì)量。可以說軟件工程的重要性要遠大于編程語言本身,畢竟軟件是思想的產(chǎn)物,而語言只是表達思想的手段。
目前,已經(jīng)出版的Web開發(fā)類圖書大多都把重點放在了Web框架的使用和項目的編碼實現(xiàn)上,而鮮見一本從軟件的設(shè)計思想、架構(gòu)和開發(fā)模式的角度講解Web開發(fā)的圖書。這便是筆者寫作《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》的原因!禬eb開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》將帶領(lǐng)讀者快速建立軟件開發(fā)的知識體系,了解基于ASP.NET Core的項目案例的開發(fā)過程,從而幫助讀者系統(tǒng)地學(xué)習(xí)開發(fā)高效、穩(wěn)定的Web應(yīng)用程序所需要掌握的知識。
《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》特色
- 不局限于Web框架的介紹,而是以架構(gòu)和模式為起點,全面介紹應(yīng)用軟件解決問題的思路和方法。這些思路和方法是新入職開發(fā)人員所缺乏的,也是他們職業(yè)晉級所的。
- 通過一個Web應(yīng)用項目案例,詳細介紹領(lǐng)域驅(qū)動設(shè)計的落地過程和支撐技術(shù),這對于Web應(yīng)用開發(fā)人員而言有較高的參考價值。
- 用理論結(jié)合實戰(zhàn)的方式進行講解,幫助讀者快速掌握項目開發(fā)的相關(guān)知識和技巧。
- 《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》的項目案例源代碼具有較高的工程應(yīng)用價值,讀者稍加修改即可用于自己的項目開發(fā)中。
《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》內(nèi)容
第1篇 軟件開發(fā)內(nèi)功心法
第1章主要介紹開發(fā)一個軟件項目需要面對的幾個問題,包括領(lǐng)域模型的創(chuàng)建、架構(gòu)的選擇、軟件框架的使用和數(shù)據(jù)存儲的實現(xiàn)。
第2章主要介紹軟件的發(fā)展歷程,以及幾種主流編程規(guī)范的特點和它們在描述問題、解決問題時的思想。其中,重點介紹面向?qū)ο蠛兔嫦蚪M件的編程思想,這是后續(xù)章節(jié)中要頻繁使用的。
第3章圍繞軟件架構(gòu)展開,主要介紹架構(gòu)的概念、意義和描述架構(gòu)的4 1視圖,并介紹幾種Web應(yīng)用的常用架構(gòu),以及它們之間的演進過程。
第4章主要介紹面向?qū)ο蟪绦蛟O(shè)計的六大原則和設(shè)計模式的相關(guān)知識,這些原則用于指導(dǎo)開發(fā)人員在面向?qū)ο蟮某绦蛟O(shè)計中避免錯誤的選擇,而更具象的設(shè)計模式則是這些原則的實際應(yīng)用。
第5章介紹項目案例iShopping的背景知識,以及如何用4 1視圖設(shè)計和描述項目架構(gòu)。該項目是用流行的ASP.NET Core框架實現(xiàn)的,它是一款非常典型的企業(yè)級Web應(yīng)用。
第2篇 領(lǐng)域驅(qū)動設(shè)計落地
第6章介紹領(lǐng)域驅(qū)動設(shè)計的工具,以及組成領(lǐng)域模型的基本元素的概念和意義。
第7章介紹如何綜合運用第6章中介紹的工具和元素創(chuàng)建項目案例的領(lǐng)域模型。
第8~10章分別對iShopping系統(tǒng)的基礎(chǔ)設(shè)施層、應(yīng)用程序?qū)雍蚒I層的實現(xiàn)展開講解,展示一個Web應(yīng)用程序的完整實現(xiàn)過程。
配套資源獲取方式
《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》項目案例的完整源代碼需要讀者自行下載。請在華章公司的網(wǎng)站(www.hzbook.com)上搜索到《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》,然后單擊資料下載按鈕,即可在《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》頁面上找到下載鏈接。另外,讀者還可以通過https://e.coding.net/ishopping/ishopping/iShopping.git網(wǎng)站進行獲取。
讀者對象
《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》適合以下讀者閱讀:
- 有一定C#基礎(chǔ)的Web開發(fā)人員;
- 想提升Web項目開發(fā)水平的程序員;
- Web開發(fā)項目經(jīng)理;
- 高校相關(guān)專業(yè)的學(xué)生;
- 相關(guān)培訓(xùn)機構(gòu)的學(xué)員。
《Web開發(fā)者晉級之道:架構(gòu)、模式和領(lǐng)域驅(qū)動設(shè)計》意在幫助新入行的軟件開發(fā)人員和編程愛好者快速了解和掌握基于ASP.NET Core 的Web應(yīng)用程序開發(fā)技術(shù)。閱讀本書需要讀者具備基本的C#語言基礎(chǔ)和面向?qū)ο蟪绦蛟O(shè)計的基礎(chǔ)知識。另外,建議讀者對統(tǒng)一建模語言(Unified Modeling Language,UML)也要有所了解,這有助于更好地理解書中的模型。
致謝
編寫本書遇到的困難遠超筆者的想象。如果沒有家人和朋友的支持,很難想象筆者能完成這本書的寫作。在此首先要感謝筆者的家人,在編寫本書的一年多的時間里,筆者陪伴他們太少。另外還要感謝參與本書出版的編輯,他們一次次不厭其煩地幫我出謀劃策并細心地修改書稿,才得以讓本書順利出版。后感謝讀者朋友們,本書因你們而有價值。
……
前言
第1篇 軟件開發(fā)內(nèi)功心法
第1章 如何開始一個軟件項目 2
1.1 軟件項目開發(fā)面臨的挑戰(zhàn) 2
1.1.1 領(lǐng)域模型的創(chuàng)建 3
1.1.2 架構(gòu)的選擇 4
1.1.3 軟件框架的使用 5
1.1.4 數(shù)據(jù)存儲的實現(xiàn) 6
1.2 小結(jié) 6
第2章 軟件如何解決問題 7
2.1 軟件的發(fā)展歷程 7
2.1.1 面向過程的編程 8
2.1.2 面向?qū)ο蟮木幊?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 小結(jié) 35
第3章 軟件架構(gòu) 36
3.1 軟件架構(gòu)概述 36
3.1.1 軟件架構(gòu)的定義 36
3.1.2 軟件架構(gòu)風(fēng)格和架構(gòu)模式 38
3.1.3 4 1視圖 40
3.2 主流軟件架構(gòu)簡介 41
3.2.1 分層架構(gòu) 41
3.2.2 MVC架構(gòu) 45
3.2.3 REST架構(gòu) 47
3.2.4 微服務(wù)架構(gòu) 52
3.3 小結(jié) 54
第4章 面向?qū)ο蟮脑O(shè)計模式和原則 55
4.1 重用 55
4.1.1 繼承重用 56
4.1.2 組合重用 60
4.1.3 模式重用 62
4.2 面向?qū)ο蟮脑O(shè)計原則 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 設(shè)計模式 79
4.3.1 設(shè)計模式的定義 80
4.3.2 設(shè)計模式的分類和應(yīng)用 80
4.3.3 如何使用設(shè)計模式 81
4.4 小結(jié) 81
第5章 項目概況與架構(gòu)設(shè)計 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的架構(gòu)設(shè)計 86
5.2.1 領(lǐng)域驅(qū)動設(shè)計和邏輯視圖 86
5.2.2 開發(fā)視圖 88
5.2.3 進程視圖 89
5.2.4 物理視圖 91
5.2.5 場景視圖 92
5.3 小結(jié) 93
第2篇 領(lǐng)域驅(qū)動設(shè)計落地
第6章 領(lǐng)域模型 96
6.1 領(lǐng)域驅(qū)動設(shè)計 96
6.2 領(lǐng)域?qū)ο蟮淖R別與創(chuàng)建 98
6.2.1 實體對象 99
6.2.2 實體對象的標識和替換 104
6.2.3 值對象 108
6.2.4 用值對象封裝復(fù)雜的邏輯 114
6.3 整體設(shè)計 124
6.3.1 領(lǐng)域的劃分 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 聚合對象之間的導(dǎo)航 151
6.4.4 聚合內(nèi)部對象的實現(xiàn)和引用 156
6.5 領(lǐng)域服務(wù)對象 157
6.5.1 領(lǐng)域服務(wù) 158
6.5.2 領(lǐng)域服務(wù)和應(yīng)用服務(wù) 160
6.5.3 領(lǐng)域服務(wù)與貧血模型 161
6.6 領(lǐng)域事件 163
6.6.1 領(lǐng)域事件簡介 164
6.6.2 領(lǐng)域事件的發(fā)布和訂閱 166
6.7 領(lǐng)域?qū)ο蟮纳芷?176
6.7.1 工廠和構(gòu)建器 176
6.7.2 倉儲對象 179
6.8 小結(jié) 182
第7章 綜合運用領(lǐng)域模型 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 訂單費用計算服務(wù)的實現(xiàn) 229
7.3 小結(jié) 232
第8章 基礎(chǔ)設(shè)施層的實現(xiàn) 233
8.1 基礎(chǔ)設(shè)施層的創(chuàng)建 233
8.2 數(shù)據(jù)存儲 234
8.2.1 數(shù)據(jù)庫設(shè)計范式 235
8.2.2 事務(wù) 238
8.2.3 NoSQL數(shù)據(jù)庫 240
8.3 對象關(guān)系映射 241
8.3.1 對象-數(shù)據(jù)庫阻抗失配 241
8.3.2 對象關(guān)系映射的困難 242
8.3.3 傳統(tǒng)的數(shù)據(jù)訪問技術(shù)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應(yīng)用 280
8.5.1 MongoDB數(shù)據(jù)庫 281
8.5.2 使用MongoDB實現(xiàn)對象倉儲 283
8.6 RabbitMQ應(yīng)用 287
8.6.1 RabbitMQ的安裝和配置 288
8.6.2 使用RabbitMQ實現(xiàn)事件總線 290
8.7 使用第三方WebAPI 297
8.7.1 WebAPI訪問技術(shù) 297
8.7.2 使用WebAPI實現(xiàn)運輸距離的計算 300
8.8 小結(jié) 303
第9章 應(yīng)用程序?qū)拥膶崿F(xiàn) 304
9.1 應(yīng)用程序?qū)雍喗?304
9.1.1 應(yīng)用程序?qū)雍蛻?yīng)用服務(wù) 306
9.1.2 應(yīng)用服務(wù)的接口形式 310
9.1.3 CQRS風(fēng)格的應(yīng)用服務(wù) 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 小結(jié) 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 控制器和領(lǐng)域模型 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 視圖與服務(wù)器的異步通信 379
10.4 小結(jié) 382
……