Web應(yīng)用程序是企業(yè)應(yīng)用開(kāi)發(fā)的主流領(lǐng)域之一,它一般采用客戶(hù)端-服務(wù)器架構(gòu),用戶(hù)在客戶(hù)端的瀏覽器上進(jìn)行人機(jī)交互,而重要的邏輯和數(shù)據(jù)計(jì)算則在服務(wù)器上進(jìn)行。隨著移動(dòng)互聯(lián)網(wǎng)的普及,手機(jī)App逐漸興盛,它比Web應(yīng)用程序有更好的用戶(hù)體驗(yàn),在使用的靈活性上也遠(yuǎn)超Web應(yīng)用程序,以至于出現(xiàn)了手機(jī)App會(huì)代替Web應(yīng)用程序的說(shuō)法。但這種說(shuō)法忽略了一個(gè)事實(shí):一個(gè)軟件,尤其是企業(yè)應(yīng)用軟件,其核心在于解決問(wèn)題的領(lǐng)域模型。從這個(gè)角度看,手機(jī)App和Web應(yīng)用程序的區(qū)別僅僅在于人機(jī)交互方式的不同,手機(jī)App同樣采用客戶(hù)端-服務(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ù)器端的越來(lái)越復(fù)雜的領(lǐng)域模型代碼也不會(huì)改變。
開(kāi)發(fā)一個(gè)功能強(qiáng)大、性能穩(wěn)定、使用靈活和易擴(kuò)展的Web應(yīng)用程序離不開(kāi)編程語(yǔ)言的支持,更離不開(kāi)軟件工程的支持。如果說(shuō)軟件產(chǎn)品是現(xiàn)實(shí)的抽象,那么軟件工程就是抽象的抽象,或者說(shuō)是對(duì)軟件開(kāi)發(fā)過(guò)程和解決方案的提煉與重用。對(duì)于開(kāi)發(fā)人員而言,編程語(yǔ)言是基礎(chǔ),但其對(duì)軟件工程的理解程度決定了他所開(kāi)發(fā)的軟件的質(zhì)量?梢哉f(shuō)軟件工程的重要性要遠(yuǎn)大于編程語(yǔ)言本身,畢竟軟件是思想的產(chǎn)物,而語(yǔ)言只是表達(dá)思想的手段。
目前,已經(jīng)出版的Web開(kāi)發(fā)類(lèi)圖書(shū)大多都把重點(diǎn)放在了Web框架的使用和項(xiàng)目的編碼實(shí)現(xiàn)上,而鮮見(jiàn)一本從軟件的設(shè)計(jì)思想、架構(gòu)和開(kāi)發(fā)模式的角度講解Web開(kāi)發(fā)的圖書(shū)。這便是筆者寫(xiě)作《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》的原因!禬eb開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》將帶領(lǐng)讀者快速建立軟件開(kāi)發(fā)的知識(shí)體系,了解基于ASP.NET Core的項(xiàng)目案例的開(kāi)發(fā)過(guò)程,從而幫助讀者系統(tǒng)地學(xué)習(xí)開(kāi)發(fā)高效、穩(wěn)定的Web應(yīng)用程序所需要掌握的知識(shí)。
《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》特色
- 不局限于Web框架的介紹,而是以架構(gòu)和模式為起點(diǎn),全面介紹應(yīng)用軟件解決問(wèn)題的思路和方法。這些思路和方法是新入職開(kāi)發(fā)人員所缺乏的,也是他們職業(yè)晉級(jí)所的。
- 通過(guò)一個(gè)Web應(yīng)用項(xiàng)目案例,詳細(xì)介紹領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的落地過(guò)程和支撐技術(shù),這對(duì)于Web應(yīng)用開(kāi)發(fā)人員而言有較高的參考價(jià)值。
- 用理論結(jié)合實(shí)戰(zhàn)的方式進(jìn)行講解,幫助讀者快速掌握項(xiàng)目開(kāi)發(fā)的相關(guān)知識(shí)和技巧。
- 《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》的項(xiàng)目案例源代碼具有較高的工程應(yīng)用價(jià)值,讀者稍加修改即可用于自己的項(xiàng)目開(kāi)發(fā)中。
《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》內(nèi)容
第1篇 軟件開(kāi)發(fā)內(nèi)功心法
第1章主要介紹開(kāi)發(fā)一個(gè)軟件項(xiàng)目需要面對(duì)的幾個(gè)問(wèn)題,包括領(lǐng)域模型的創(chuàng)建、架構(gòu)的選擇、軟件框架的使用和數(shù)據(jù)存儲(chǔ)的實(shí)現(xiàn)。
第2章主要介紹軟件的發(fā)展歷程,以及幾種主流編程規(guī)范的特點(diǎn)和它們?cè)诿枋鰡?wèn)題、解決問(wèn)題時(shí)的思想。其中,重點(diǎn)介紹面向?qū)ο蠛兔嫦蚪M件的編程思想,這是后續(xù)章節(jié)中要頻繁使用的。
第3章圍繞軟件架構(gòu)展開(kāi),主要介紹架構(gòu)的概念、意義和描述架構(gòu)的4 1視圖,并介紹幾種Web應(yīng)用的常用架構(gòu),以及它們之間的演進(jìn)過(guò)程。
第4章主要介紹面向?qū)ο蟪绦蛟O(shè)計(jì)的六大原則和設(shè)計(jì)模式的相關(guān)知識(shí),這些原則用于指導(dǎo)開(kāi)發(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)展開(kāi)講解,展示一個(gè)Web應(yīng)用程序的完整實(shí)現(xiàn)過(guò)程。
配套資源獲取方式
《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》項(xiàng)目案例的完整源代碼需要讀者自行下載。請(qǐng)?jiān)谌A章公司的網(wǎng)站(www.hzbook.com)上搜索到《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》,然后單擊資料下載按鈕,即可在《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》頁(yè)面上找到下載鏈接。另外,讀者還可以通過(guò)https://e.coding.net/ishopping/ishopping/iShopping.git網(wǎng)站進(jìn)行獲取。
讀者對(duì)象
《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》適合以下讀者閱讀:
- 有一定C#基礎(chǔ)的Web開(kāi)發(fā)人員;
- 想提升Web項(xiàng)目開(kāi)發(fā)水平的程序員;
- Web開(kāi)發(fā)項(xiàng)目經(jīng)理;
- 高校相關(guān)專(zhuān)業(yè)的學(xué)生;
- 相關(guān)培訓(xùn)機(jī)構(gòu)的學(xué)員。
《Web開(kāi)發(fā)者晉級(jí)之道:架構(gòu)、模式和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》意在幫助新入行的軟件開(kāi)發(fā)人員和編程愛(ài)好者快速了解和掌握基于ASP.NET Core 的Web應(yīng)用程序開(kāi)發(fā)技術(shù)。閱讀本書(shū)需要讀者具備基本的C#語(yǔ)言基礎(chǔ)和面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)知識(shí)。另外,建議讀者對(duì)統(tǒng)一建模語(yǔ)言(Unified Modeling Language,UML)也要有所了解,這有助于更好地理解書(shū)中的模型。
致謝
編寫(xiě)本書(shū)遇到的困難遠(yuǎn)超筆者的想象。如果沒(méi)有家人和朋友的支持,很難想象筆者能完成這本書(shū)的寫(xiě)作。在此首先要感謝筆者的家人,在編寫(xiě)本書(shū)的一年多的時(shí)間里,筆者陪伴他們太少。另外還要感謝參與本書(shū)出版的編輯,他們一次次不厭其煩地幫我出謀劃策并細(xì)心地修改書(shū)稿,才得以讓本書(shū)順利出版。后感謝讀者朋友們,本書(shū)因你們而有價(jià)值。
……
前言
第1篇 軟件開(kāi)發(fā)內(nèi)功心法
第1章 如何開(kāi)始一個(gè)軟件項(xiàng)目 2
1.1 軟件項(xiàng)目開(kāi)發(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章 軟件如何解決問(wèn)題 7
2.1 軟件的發(fā)展歷程 7
2.1.1 面向過(guò)程的編程 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ì)象和類(lèi)型 22
2.2.2 對(duì)象的創(chuàng)建和生命周期的控制 23
2.2.3 對(duì)象的依賴(lài) 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 開(kāi)閉原則 65
4.2.3 里氏代換原則 67
4.2.4 依賴(lài)倒置原則 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ì)模式的分類(lèi)和應(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 集成開(kāi)發(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 開(kāi)發(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 工廠(chǎng)和構(gòu)建器 176
6.7.2 倉(cāng)儲(chǔ)對(duì)象 179
6.8 小結(jié) 182
第7章 綜合運(yùn)用領(lǐng)域模型 183
7.1 商品目錄上下文的實(shí)現(xiàn) 183
7.1.1 商品分類(lèi)聚合的實(shí)現(xiàn) 184
7.1.2 商品聚合的實(shí)現(xiàn) 192
7.2 訂單上下文的實(shí)現(xiàn) 202
7.2.1 購(gòu)物車(chē)聚合的實(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ù)庫(kù)設(shè)計(jì)范式 235
8.2.2 事務(wù) 238
8.2.3 NoSQL數(shù)據(jù)庫(kù) 240
8.3 對(duì)象關(guān)系映射 241
8.3.1 對(duì)象-數(shù)據(jù)庫(kù)阻抗失配 241
8.3.2 對(duì)象關(guān)系映射的困難 242
8.3.3 傳統(tǒng)的數(shù)據(jù)訪(fǎng)問(wèn)技術(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ì)象倉(cāng)儲(chǔ) 270
8.5 MongoDB應(yīng)用 280
8.5.1 MongoDB數(shù)據(jù)庫(kù) 281
8.5.2 使用MongoDB實(shí)現(xiàn)對(duì)象倉(cāng)儲(chǔ) 283
8.6 RabbitMQ應(yīng)用 287
8.6.1 RabbitMQ的安裝和配置 288
8.6.2 使用RabbitMQ實(shí)現(xiàn)事件總線(xiàn) 290
8.7 使用第三方WebAPI 297
8.7.1 WebAPI訪(fǎng)問(wèn)技術(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)查詢(xún)的方法 319
9.2.1 對(duì)象的映射 319
9.2.2 查詢(xún)過(guò)濾器 321
9.2.3 數(shù)據(jù)代理 327
9.2.4 查詢(xún)門(mén)面 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 依賴(lài)注入容器 367
10.2.3 搭建前端開(kāi)發(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
……