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