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