.NET整潔架構(gòu)之道 [意]迪諾·埃斯波西托 整潔架構(gòu) .NET 軟件架構(gòu) 架構(gòu)師成長(zhǎng)
定 價(jià):99 元
當(dāng)前圖書(shū)已被 2 所學(xué)校薦購(gòu)過(guò)!
查看明細(xì)
- 作者:[意]迪諾·埃斯波西托
- 出版時(shí)間:2025/9/1
- ISBN:9787111789895
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類(lèi):
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:
- 開(kāi)本:16開(kāi)
本書(shū)分為三部分。第一部分為理論,為軟件模塊化奠定了基礎(chǔ),追溯了軟件架構(gòu)的歷史,并總結(jié)了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的要點(diǎn)——這是一種非常有助于拆解業(yè)務(wù)領(lǐng)域的方法,盡管在項(xiàng)目中并非必要。第二部分為實(shí)現(xiàn),講述了構(gòu)成“整潔”架構(gòu)的五個(gè)層。這部分的重點(diǎn)并不在于架構(gòu)的同心圓形式,這種形式已經(jīng)被大量的書(shū)籍和文章所普及,而在于各個(gè)構(gòu)成層次所提供的實(shí)際價(jià)值:表示層、應(yīng)用層、領(lǐng)域?qū)、領(lǐng)域服務(wù)層和基礎(chǔ)設(shè)施層。第三部分為應(yīng)用,主要關(guān)注三個(gè)經(jīng)常遇到的話(huà)題:是選擇單體應(yīng)用還是微服務(wù),是選擇客戶(hù)端渲染還是服務(wù)器端渲染,以及技術(shù)債務(wù)和技術(shù)信用。
理論與實(shí)踐深度融合:不僅解析模塊化架構(gòu)的理論基礎(chǔ),更通過(guò)具體實(shí)現(xiàn)層(五層架構(gòu))和實(shí)際應(yīng)用場(chǎng)景(單體/微服務(wù)、渲染模式選擇等)提供可落地的解決方案。
1990年夏,我畢業(yè)于計(jì)算機(jī)科學(xué)專(zhuān)業(yè)。那個(gè)時(shí)候,在歐洲,可以學(xué)習(xí)計(jì)算機(jī)相關(guān)專(zhuān)業(yè)的地方寥寥無(wú)幾。學(xué)校里并沒(méi)有獨(dú)立的計(jì)算機(jī)學(xué)院,計(jì)算機(jī)科學(xué)是數(shù)學(xué)、物理和自然科學(xué)等更傳統(tǒng)學(xué)科的延伸。在20世紀(jì)90年代,那些計(jì)算機(jī)領(lǐng)域的專(zhuān)家被視為神奇的存在—他們廣受歡迎,但職業(yè)發(fā)展路徑卻不甚明朗。我最初從事Windows開(kāi)發(fā)工作。當(dāng)時(shí),計(jì)算機(jī)雜志極受追捧,人們每個(gè)月都滿(mǎn)懷期待地等待新一期的發(fā)行。我夢(mèng)想著能為這些雜志撰稿。我曾有幸獲得了一次這樣的機(jī)會(huì),并且樂(lè)此不疲,以至于30年后的今天我還在從事這項(xiàng)工作。我熱衷于知識(shí)分享,以至于在我第一份正式開(kāi)發(fā)工作結(jié)束的五年里,它成了我的主要職業(yè)。在接下來(lái)的二十多年里,我的生活幾乎就是撰寫(xiě)書(shū)籍和文章、在會(huì)議上發(fā)言、授課,以及偶爾提供咨詢(xún)服務(wù)。直至2020年,我接觸到的實(shí)際開(kāi)發(fā)中的代碼和日常開(kāi)發(fā)的機(jī)會(huì)都極其有限。盡管如此,我還是為那些參與實(shí)際項(xiàng)目的人成功地編寫(xiě)了多本參考書(shū)籍。然而,在我內(nèi)心深處,仍舊縈繞著一個(gè)難解的疑問(wèn):我僅僅是一個(gè)擅長(zhǎng)講授的專(zhuān)業(yè)人士,還是也能成為實(shí)踐者呢?我是否有能力構(gòu)建一個(gè)實(shí)際應(yīng)用的系統(tǒng)呢?環(huán)境及其他生活上的變故最終幫我找到了答案。我面臨著一項(xiàng)艱巨的任務(wù),那就是在原本計(jì)劃時(shí)間的一小部分內(nèi)構(gòu)建一個(gè)龐大而復(fù)雜的系統(tǒng),而變故又大幅縮短了這一時(shí)間。這期間,我對(duì)系統(tǒng)設(shè)計(jì)、敏捷開(kāi)發(fā)、進(jìn)行測(cè)試和規(guī)劃都顯得力不從心—唯一確定的就是截止日期。我采取了行動(dòng),并按照我多年來(lái)在教學(xué)中探索和實(shí)踐的路徑。這種做法證明是成功的。不止如此,在這個(gè)過(guò)程中,我意識(shí)到我構(gòu)建軟件的方式及其相關(guān)模式實(shí)際上被稱(chēng)為“整潔架構(gòu)”。本書(shū)匯集了我在過(guò)去二十多年間的學(xué)習(xí)、教授和咨詢(xún)知識(shí),以及最近三年在軟件開(kāi)發(fā)實(shí)踐中的核心經(jīng)驗(yàn)。我所在公司中的幾位開(kāi)發(fā)者都是從初級(jí)職位起步的,他們通過(guò)使用和實(shí)踐本書(shū)中的內(nèi)容得到了成長(zhǎng)。我希望本書(shū)對(duì)你同樣有所幫助!本書(shū)讀者對(duì)象本書(shū)主要面向軟件專(zhuān)業(yè)人士,包括架構(gòu)師、首席開(kāi)發(fā)人員,以及我特別要提到的.NET應(yīng)用程序的開(kāi)發(fā)者。每個(gè)想成為軟件架構(gòu)師的人都會(huì)從本書(shū)中受益匪淺。而且,真正合格的架構(gòu)師,大多是從開(kāi)發(fā)者成長(zhǎng)起來(lái)的。我堅(jiān)信,打造卓越軟件的關(guān)鍵在于優(yōu)秀的開(kāi)發(fā)者,而優(yōu)秀的開(kāi)發(fā)者則源自?xún)?yōu)秀教師的悉心教導(dǎo)、良好榜樣的積極引領(lǐng),以及—但愿如此—優(yōu)秀的書(shū)籍和課程的滋養(yǎng)。本書(shū)所有章節(jié)都帶有.NET特色,且大多數(shù)內(nèi)容對(duì)任何軟件專(zhuān)業(yè)人士來(lái)說(shuō)都是易于理解且有用的。閱讀本書(shū)所需的知識(shí)閱讀本書(shū),希望你至少對(duì).NET開(kāi)發(fā)和面向?qū)ο缶幊谈拍钣凶罨镜牧私。如果你?duì)使用.NET平臺(tái)有良好的基礎(chǔ),并且了解一些數(shù)據(jù)訪(fǎng)問(wèn)技術(shù),那么這將對(duì)你閱讀本書(shū)有所幫助。這不是一本關(guān)于抽象設(shè)計(jì)概念的書(shū),也不是一本充滿(mǎn)交叉引用或者在方括號(hào)中使用花哨字符串鏈接到書(shū)末參考文獻(xiàn)中某篇舊論文的經(jīng)典架構(gòu)書(shū)。這是一本關(guān)于在21世紀(jì)20年代建立系統(tǒng)并面對(duì)21世紀(jì)20年代困境的書(shū),從前端到后端,包含云平臺(tái)和可擴(kuò)展性問(wèn)題。本書(shū)適合的場(chǎng)景如果你正在尋找一本參考書(shū),或者想要了解如何使用某種模式或技術(shù),那么本書(shū)可能不適合你。相反,本書(shū)的目標(biāo)是分享和傳遞知識(shí),讓你在任何時(shí)候都知道該怎么做;蛘咧辽伲悻F(xiàn)在知道在類(lèi)似情況下,其他人—Dino和他的團(tuán)隊(duì)—是怎么做的。本書(shū)組織結(jié)構(gòu)總的來(lái)說(shuō),現(xiàn)代軟件架構(gòu)只有一個(gè)前提條件:模塊化。無(wú)論你采用分布式、面向服務(wù)的結(jié)構(gòu),還是微服務(wù)碎片化模式,或是緊湊的單體應(yīng)用,模塊化都是構(gòu)建和管理代碼庫(kù),以及根據(jù)業(yè)務(wù)需求進(jìn)一步增強(qiáng)應(yīng)用的關(guān)鍵。如果沒(méi)有模塊化,你可能只能一次性交付一個(gè)能夠運(yùn)行的系統(tǒng),但是要擴(kuò)展和更新它就會(huì)變得很困難。本書(shū)第一部分為理論,為軟件模塊化奠定了基礎(chǔ),追溯了軟件架構(gòu)的歷史,并總結(jié)了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design,DDD)的要點(diǎn)—這是一種非常有助于拆解業(yè)務(wù)領(lǐng)域的方法,盡管在項(xiàng)目中并非絕對(duì)必要。第二部分為實(shí)現(xiàn),講述了在本書(shū)的視角中構(gòu)成“整潔”架構(gòu)的五個(gè)層。這部分的重點(diǎn)并不在于架構(gòu)的同心圓形式(這種形式在大量的書(shū)籍和文章中很常見(jiàn)),而在于表示層、應(yīng)用層、領(lǐng)域?qū)、領(lǐng)域服務(wù)層和基礎(chǔ)設(shè)施層所提供的實(shí)際價(jià)值。第三部分為應(yīng)用,主要關(guān)注三個(gè)經(jīng)常遇到的話(huà)題:是選擇單體應(yīng)用還是微服務(wù),是選擇客戶(hù)端渲染還是服務(wù)器端渲染,以及技術(shù)債務(wù)和技術(shù)信用。本書(shū)配套代碼本書(shū)的第二部分描述了一個(gè)名為Renoir項(xiàng)目的參考應(yīng)用程序,其全部代碼都可以在GitHub上找到:https://github.com/Youbiquitous/project-renoir源代碼的壓縮版本也可以在MicrosoftPressStore.com/NET/download上下載。提示這個(gè)參考應(yīng)用程序需要.NET 8,并且是一個(gè)帶有Blazor前端的ASP.NET應(yīng)用程序。它使用Entity Framework進(jìn)行數(shù)據(jù)訪(fǎng)問(wèn),并假設(shè)有一個(gè)SQL Server(任何版本)數(shù)據(jù)庫(kù)。
迪諾·埃斯波西托(Dino Esposito)軟件開(kāi)發(fā)領(lǐng)域享有盛譽(yù)的權(quán)威專(zhuān)家,IT團(tuán)隊(duì)領(lǐng)導(dǎo)者,他擁有超過(guò)25年的編程經(jīng)驗(yàn),職業(yè)生涯始于1992年的C語(yǔ)言開(kāi)發(fā),親身見(jiàn)證并參與了.NET框架的誕生、Silverlight技術(shù)的興衰以及各種架構(gòu)模式的演進(jìn)。作為16次微軟MVP(最有價(jià)值專(zhuān)家)得主,迪諾已撰寫(xiě)了20多本技術(shù)書(shū)籍和超過(guò)1000篇文章,其著作和見(jiàn)解對(duì)全球數(shù)千名.NET開(kāi)發(fā)人員和架構(gòu)師的職業(yè)成長(zhǎng)產(chǎn)生了深遠(yuǎn)影響。他善于將復(fù)雜的架構(gòu)概念轉(zhuǎn)化為可實(shí)踐的指導(dǎo)原則,他領(lǐng)導(dǎo)的團(tuán)隊(duì)在全球范圍內(nèi)參與構(gòu)建和維護(hù)ASP.NET平臺(tái)。
譯者序前言致謝第一部分 理論第1章 模塊化軟件架構(gòu)的歷史和演變 21.1 模塊化三層架構(gòu) 31.1.1 三層架構(gòu)的主要特點(diǎn) 41.1.2 邏輯層、物理層和模塊化 61.2 DDD的典型架構(gòu) 81.2.1 DDD配套的支持架構(gòu) 81.2.2 其他補(bǔ)充 111.3 不同類(lèi)型的分層架構(gòu) 151.3.1 六邊形架構(gòu) 151.3.2 整潔架構(gòu) 161.3.3 特性驅(qū)動(dòng)架構(gòu) 171.4 本章小結(jié) 19第2章 DDD的核心精髓 202.1 DDD簡(jiǎn)介 212.1.1 戰(zhàn)略分析 212.1.2 戰(zhàn)術(shù)設(shè)計(jì) 232.1.3 DDD的誤解 242.1.4 戰(zhàn)略設(shè)計(jì)工具 262.2 UL 262.2.1 領(lǐng)域語(yǔ)言術(shù)語(yǔ)表 272.2.2 構(gòu)建術(shù)語(yǔ)表 282.2.3 保持業(yè)務(wù)和代碼的一致性 302.3 限界上下文 332.3.1 處理歧義 342.3.2 設(shè)計(jì)限界上下文 362.4 上下文映射 392.4.1 上游和下游 392.4.2 上下文映射示例 402.4.3 部署映射示例 412.5 本章小結(jié) 42第3章 模塊化設(shè)計(jì)的基礎(chǔ) 433.1 模塊化設(shè)計(jì)的要素與原則 443.1.1 SoC 443.1.2 松耦合 453.1.3 可復(fù)用性 453.1.4 依賴(lài)項(xiàng)管理 463.1.5 文檔 463.1.6 可測(cè)試性 463.2 應(yīng)用模塊化設(shè)計(jì) 473.2.1 表示層:與外界交互 473.2.2 應(yīng)用層:處理接收到的指令 483.2.3 領(lǐng)域?qū)樱罕硎绢I(lǐng)域?qū)嶓w 483.2.4 數(shù)據(jù)/基礎(chǔ)設(shè)施層:持久化數(shù)據(jù) 483.3 實(shí)現(xiàn)模塊化 483.3.1 在單體中增添模塊化設(shè)計(jì) 493.3.2 微服務(wù)簡(jiǎn)介 503.4 最簡(jiǎn)方案原則 523.4.1 可維護(hù)性 533.4.2 可測(cè)試性 543.5 本章小結(jié) 56第二部分 實(shí)現(xiàn)第4章 表示層 604.1 Renoir項(xiàng)目:最終目標(biāo) 614.1.1 應(yīng)用程序介紹 614.1.2 抽象上下文映射 634.1.3 物理上下文映射 664.2 業(yè)務(wù)需求工程 694.2.1 分解軟件項(xiàng)目 704.2.2 基于事件的故事板 704.2.3 Renoir項(xiàng)目的基本任務(wù) 724.3 表示層的邊界和部署 734.3.1 敲開(kāi)Web服務(wù)器的門(mén) 744.3.2 ASP.NET應(yīng)用程序端點(diǎn) 754.4 表示層開(kāi)發(fā) 764.4.1 連接到業(yè)務(wù)工作流 764.4.2 前端及相關(guān)技術(shù) 814.4.3 純API表示層 824.5 本章小結(jié) 83第5章 應(yīng)用層 855.1 Renoir項(xiàng)目架構(gòu)圖 865.1.1 訪(fǎng)問(wèn)控制子系統(tǒng) 865.1.2 文檔管理子系統(tǒng) 885.1.3 在Visual Studio中打開(kāi)Renoir項(xiàng)目 895.2 任務(wù)編排 905.2.1 任務(wù)簡(jiǎn)介 905.2.2 分布式任務(wù)示例 915.2.3 Renoir項(xiàng)目中的任務(wù)示例 935.3 數(shù)據(jù)傳輸 935.3.1 從表示層到應(yīng)用層 945.3.2 從應(yīng)用層到持久化層 985.4 實(shí)現(xiàn)細(xì)節(jié) 1005.4.1 應(yīng)用層概要 1015.4.2 應(yīng)用程序設(shè)置 1045.4.3 日志記錄 1085.4.4 處理和拋出異! 1135.4.5 緩存及其模式 1175.4.6 注入SignalR連接中心 1215.5 應(yīng)用層的邊界和部署 1235.5.1 依賴(lài)列表 1235.5.2 部署選項(xiàng) 1235.6 本章小結(jié) 125第6章 領(lǐng)域?qū)印 ?266.1 分解領(lǐng)域?qū)印 ?266.1.1 業(yè)務(wù)領(lǐng)域模型 1266.1.2 輔助領(lǐng)域服務(wù) 1296.2 構(gòu)建領(lǐng)域模型 1316.2.1 將焦點(diǎn)從數(shù)據(jù)轉(zhuǎn)向行為 1316.2.2 領(lǐng)域模型的組成部分 1346.2.3 Renoir項(xiàng)目的領(lǐng)域模型 1386.3 領(lǐng)域漫游指南 1396.3.1 治療軟件貧血癥 1406.3.2 實(shí)體類(lèi)的共同特征 1416.3.3 代碼禮儀 1446.3.4 代碼風(fēng)格規(guī)范 1536.3.5 編寫(xiě)真正易讀的代碼 1576.4 本章小結(jié) 160第7章 領(lǐng)域服務(wù)層 1617.1 領(lǐng)域服務(wù)的定義 1627.1.1 領(lǐng)域服務(wù)的無(wú)狀態(tài)特征 1627.1.2 標(biāo)記領(lǐng)域服務(wù)類(lèi)別 1627.1.3 領(lǐng)域服務(wù)和UL 1637.1.4 領(lǐng)域服務(wù)的數(shù)據(jù)訪(fǎng)問(wèn) 1637.1.5 領(lǐng)域服務(wù)的數(shù)據(jù)注入 1647.2 常見(jiàn)的領(lǐng)域服務(wù)場(chǎng)景 1647.2.1 確定客戶(hù)的忠誠(chéng)度狀態(tài) 1647.2.2 領(lǐng)域事件 1657.2.3 發(fā)送業(yè)務(wù)郵件 1667.2.4 為密碼加密服務(wù) 1677.3 具體實(shí)現(xiàn) 1687.3.1 領(lǐng)域服務(wù)的一個(gè)例子 1687.3.2 有用且相關(guān)的模式 1707.3.3 REPR模式 1717.4 其他問(wèn)題 1767.4.1 領(lǐng)域服務(wù)是否有必要 1767.4.2 領(lǐng)域服務(wù)的其他應(yīng)用場(chǎng)景 1787.5 本章小結(jié) 179第8章 基礎(chǔ)設(shè)施層 1808.1 基礎(chǔ)設(shè)施層的職責(zé) 1818.1.1 數(shù)據(jù)持久化和存儲(chǔ) 1818.1.2 與外部服務(wù)的通信 1828.1.3 與內(nèi)部服務(wù)的通信 1828.2 實(shí)現(xiàn)持久化層 1838.2.1 倉(cāng)庫(kù)類(lèi) 1848.2.2 使用EF Core 1888.2.3 使用Dapper 1968.2.4 在數(shù)據(jù)庫(kù)中托管業(yè)務(wù)邏輯 1978.3 數(shù)據(jù)存儲(chǔ)架構(gòu) 1998.3.1 介紹命令/查詢(xún)分離 1998.3.2 ES執(zhí)行摘要 2038.4 本章小結(jié) 204第三部分 應(yīng)用第9章 微服務(wù)和模塊化單體架構(gòu) 2069.1 遠(yuǎn)離遺留的單體系統(tǒng) 2079.1.1 并非所有單體架構(gòu)都是糟糕的 2079.1.2 單體架構(gòu)的潛在缺點(diǎn) 2089.2 關(guān)于微服務(wù) 2109.2.1 早期采用者 2119.2.2 微服務(wù)架構(gòu)和SOA的原則 2119.2.3 微服務(wù)的“微”到底有多微 2129.2.4 微服務(wù)的優(yōu)點(diǎn) 2149.2.5 微服務(wù)的缺點(diǎn) 2159.3 微服務(wù)是否適用于所有應(yīng)用程序 2229.3.1 大型企業(yè)的一個(gè)大誤解 2229.3.2 SOA和微服務(wù) 2239.3.3 微服務(wù)是否適合你的場(chǎng)景 2249.3.4 規(guī)劃和部署 2279.4 模塊化單體 2319.4.1 適用于新項(xiàng)目的架構(gòu) 2329.4.2 模塊化單體策略更適用于新項(xiàng)目 2329.4.3 從模塊到微服務(wù) 2359.5 本章小結(jié) 238第10章 客戶(hù)端渲染和服務(wù)器端渲染 23910.1 Web應(yīng)用程序簡(jiǎn)史 24010.1.1 史前時(shí)代 24010.1.2 服務(wù)器端腳本時(shí)代 24210.1.3 客戶(hù)端腳本時(shí)代 24410.2 客戶(hù)端渲染 24610.2.1 HTML層 24710.2.2 API層 25010.2.3 邁向更現(xiàn)代的史前時(shí)代 25310.3 SSR 25710.3.1 前后端分離 25810.3.2 ASP.NET前端選項(xiàng) 25910.3.3 ASP.NET Core與Node.js的對(duì)比 26210.3.4 阻塞式/非阻塞式傳說(shuō) 26510.4 本章小結(jié) 267第11章 技術(shù)債務(wù)與技術(shù)信用 26811.1 技術(shù)債務(wù)的隱藏成本 26911.1.1 處理技術(shù)債務(wù) 26911.1.2 解決債務(wù)的方法 27111.1.3 會(huì)放大債務(wù)的行為 27311.2 技術(shù)信用的隱藏收益 27511.2.1 破窗理論 27611.2.2 重構(gòu) 27811.2.3 做正確的事情 28011.3 本章小結(jié) 281