關(guān)于我們
書單推薦
新書推薦
|
像C#高手一樣編程
本書將會討論一些C#編程重要的后端技能,并且在典型情形(重構(gòu)一個代碼庫,以確保其安全,整潔和可讀)中練習(xí)應(yīng)用這些技能。本書包括6部分,第1部分位基礎(chǔ)知識講解,第2部分為代碼設(shè)計和改進(jìn),第3部分為訪問數(shù)據(jù)庫,第4部分為存儲模式,第5部分為服務(wù)層講解,第6部分為控制器類講解。在完成這些內(nèi)容和練習(xí)之后,讀者將對C#語言具有更深刻的理解,并且可以準(zhǔn)備學(xué)習(xí)更高水平的內(nèi)容。
我第一次接觸C#語言是2016年在富士膠片醫(yī)療系統(tǒng)公司工作時。我之前曾使用過Java和Python,但自從開始使用C#語言,我便沉迷其中不能自拔。我喜歡它的入門容易以及清晰的編寫方式(盡管最初是極度令人氣憤的)的特點。當(dāng)時,在公司工作期間,我多次向我的同事咨詢有關(guān)C#的問題。入門雖然很容易,但是達(dá)到熟練使用卻是另外一回事。例如,每個人,無論知識背景如何,都可以在10分鐘之內(nèi)編寫一個“Hello, World!”程序,但是充分應(yīng)用一門編程語言的最大功能以及明白為什么卻需要相當(dāng)長的時間。學(xué)習(xí)和使用一段時間之后,我很快遇到了瓶頸,于是就開始尋找能夠提升我C#水平的資料。我發(fā)現(xiàn)與.NET和C#相關(guān)的書籍有三種類型:第一種是超出語言本身的主題(整潔代碼,架構(gòu),基礎(chǔ)),卻恰巧使用了C#語言的書籍;第二種是有關(guān)如何使用C#入門編程的書籍;第三種是非常高級的,你閱讀之后可能都有資格成為微軟公司CTO的書籍。而我希望有一本書可以介于這三種類型之間,即一本可以從處理代碼開始,能引領(lǐng)讀者從初步認(rèn)識逐步了解高級主題的書,而市場上這樣的書之前并不存在,因此我就寫了本書。 如果您是軟件工程師(開發(fā)者、碼農(nóng)或者其他),之前具有一定的編程經(jīng)驗(最好是面向?qū)ο蟮模,并且想要更深入地學(xué)習(xí)C#,那么這本書非常適合您。您不必學(xué)習(xí)怎樣編寫一個條件語句,本書也不會向您解釋什么是對象。這本書中包含的技能和主題,都會幫助讀者深入學(xué)習(xí)C#語言及其平臺。當(dāng)然,我不能保證本書中的每一個知識點都是新知識,但是在這本書有限的內(nèi)容中,會盡可能嘗試多講解新知識。非常希望你們能夠喜歡這本書,并且能夠從中學(xué)到一些新知識,有新的收獲。當(dāng)然,如果本書中提到的知識都是您所熟知的,那么復(fù)習(xí)一遍也是不錯的。致謝 當(dāng)?shù)谝淮闻cManning出版社討論關(guān)于編寫這本書的時候,我其實并沒有意料到它會占用我一年的時間。實際上,我曾經(jīng)被多次提醒作者通常會低估寫書所消耗的時間,而我固執(zhí)地認(rèn)為我會是例外的那一個,我確實沒有成為例外。從2019年12月到2021年3月,我寫這本書中投入了許多的時間,我曾多次想:“這次肯定能結(jié)尾”,但是除了最后一次,都沒能成功結(jié)尾。 幸運的是,我有一位非常耐心的妻子,她一直在陪伴我,支持我。因此我首先要感謝我的妻子,沒有她堅定不移的支持,我不可能完成這本書,她是我這本書誕生的基石。我還要感謝其他家人,他們總是關(guān)心我的進(jìn)展。在本書的商業(yè)案例中,我將外祖父的名(Aljen)與祖母的姓(van der Meulen)結(jié)合起來,作為公司CEO姓名。 我還要感謝Manning出版社的朋友。特別感謝Marina Micheal,她作為本書的編輯,為本書出版做了很多工作,多虧了Marina使我現(xiàn)在不太敢在編寫書時使用will這個詞。我還有一個由JeanFranois Morin, Tanya Wilke, Eric Lippert, Rich Ward, Enrico Buonanno和Katie Tennant組成的重量級團(tuán)隊。這個由超級英雄/忍者/搖滾明星組成的洲際團(tuán)隊成員為本書反饋了很多意想不到的意見,以及技術(shù)錯誤。我還要感謝所有在出版之前閱讀本書草稿并給出細(xì)致反饋的審核人員,他們對本書的細(xì)小錯誤也毫不含糊,你們的努力付出使得這本書質(zhì)量更好。雖然我并沒有將這本書視為自己的杰作,但是我希望讀者可以從中學(xué)到一些盡可能多且有用的知識。 感謝所有的審核人員:Arnaud Bailly, Christian Thoudahl, Daniel VásquezEstupian, Edin Kapic, Foster Haines, George Thomas, Goetz Heller, Gustavo FilipeRamos Gomes, Hilde Van Gysel, Jared Duncan, Jason Hales, JeanFranois Morin, JeffNeumann, Karthikeyarajan Rajendran, Luis Moux, Marc Roulleau, Mario Solomou, Noah Betzen, Oliver Korten, Patrick Regan, Prabhuti Prakash, Raymond Cheung, Reza Zeinali, Richard B. Ward, Richard DeHoff, Sau Fai Fong, Slavomir Furman, Tanya Wilke, Thomas F. Gueth, Víctor M. Pérez和Viktor Bek。 最后,我還要感謝幾個人,他們不僅在我的職業(yè)生涯中扮演著非常重要的角色,還幫助我完成了本書的部分編寫工作。首先是David Lavielle和Duncan Handerson,感謝你們給我機會,為我提供了第一份軟件開發(fā)工作;然后是Jerry Finegan,感謝您帶我了解C#語言,并為我解答疑惑,非常感謝您的耐心和回復(fù)。Michael Breecher:感謝您參與編寫本書中有關(guān)的內(nèi)容(在大半夜回復(fù)我一些有關(guān)符號的奇怪?jǐn)?shù)學(xué)問題),這本書因為您的參與而變得更完美。Szymon Zuberek,第二章的初稿是在您紐約的公寓里完成的,非常感謝您提供了很多聊天話題。我還要感謝Acronis和Workiva公司的優(yōu)秀同事,他們常常認(rèn)真聽我絮叨這本書,他們真的很有耐心。致謝像C#高手一樣編程本書內(nèi)容簡介 這本書內(nèi)容是基于現(xiàn)有的編程技能,又可幫助大家進(jìn)一步提高編程實踐技能,或者幫助您從對Java或其他面向?qū)ο蟮木幊陶Z言認(rèn)知過渡到對C#認(rèn)知。本書將教您學(xué)習(xí)如何編寫對于企業(yè)開發(fā)至關(guān)重要、地道的C#代碼。書中會討論一些重要的后端方面的技能,以及在典型情形(重構(gòu)一個代碼庫,以確保其安全、整潔和可讀)中如何練習(xí)并應(yīng)用這些技能。在完成書中這些練習(xí)之后,您將對C#語言具有更深刻的理解,并且具有學(xué)習(xí)更高水平內(nèi)容的基礎(chǔ)。 本書中并不會介紹“Hello,World!”或者計算機基礎(chǔ),而是會引導(dǎo)大家通過重構(gòu)一個過時的代碼庫來進(jìn)行學(xué)習(xí),教您嘗試采用新技術(shù)、新工具和最佳實現(xiàn)方式將這個代碼庫升級到現(xiàn)代C#的標(biāo)準(zhǔn)。在本書中,我們將以一個現(xiàn)有的(.NET框架下編寫的)代碼庫為例,使用簡化的API將其重構(gòu)為.NET5框架。 本書讀者群體 如果您是一名精通面向?qū)ο缶幊陶Z言的開發(fā)人員,無論您會的是Java、Dart、C++,還是其他語言,本書都可以幫助您快速掌握C#和 .NET。您之前擁有的知識完全可以應(yīng)用上,不必花費時間重新學(xué)習(xí)編寫一個if語句 同樣,如果您精通一些類似于Go、C、JavaScript、Python或其他一些主流編程語言,通過認(rèn)真學(xué)習(xí)本書內(nèi)容,您將能夠編寫完整、地道的C#代碼。如果您想要學(xué)習(xí)一些有關(guān)面向?qū)ο蟮脑O(shè)計知識,學(xué)習(xí)C#也沒有壞處(提示一點,如果您之前使用的是Go語言,請在使用接口時一定要特別小心,因為它們的工作方式并不相同)。 還有一種情況,如果您已經(jīng)使用過C#,并且想要知道如何“提升”您的C#知識,這本書會很適合您,本書中有很多學(xué)習(xí)高級C#的知識,本書將會幫您想要彌補的知識。 本書主要結(jié)構(gòu) 與其他普通技術(shù)書籍相比,本書的結(jié)構(gòu)有些非常規(guī)。大部分的技術(shù)書籍都屬于參考性書,讀者可以以任何順序來閱讀,而這本書并不是參考書,需要按照順序閱讀。如圖01所示,本書圍繞以下6個部分構(gòu)成: (1) “C#和 .NET”,在第1章中會討論這本書是什么樣的書,這本書會教什么,不教什么。第2章主要是對C#語言和.NET生態(tài)的簡單回顧,重點介紹.NET的優(yōu)越性,以及C#是如何編譯的。 (2) “現(xiàn)有代碼倉庫”,在這部分,會指導(dǎo)探索我們目前已有的代碼庫。這部分介紹現(xiàn)有代碼庫,并討論代碼庫的設(shè)計缺陷和潛在改進(jìn)方案。 (3) “數(shù)據(jù)庫訪問層”,這部分開始重寫整個服務(wù)。在第3部分中,將專注于介紹創(chuàng)建全新的 .NET Core項目,并教大家學(xué)習(xí)如何使用Entity Framework Core連接到云(或本地)數(shù)據(jù)庫。另外,本部分討論的內(nèi)容還包括存儲/服務(wù)(repository/service)模式、虛方法(virtual method)、屬性(property)和密封類(sealed class)。 (4) “存儲層”,在第4部分,將教大家進(jìn)一步了解存儲/服務(wù)模式,如何實現(xiàn)五個存儲庫類。您將了解到依賴注入(dependency injection)、多線程(包括lcok鎖、mutex互斥鎖和semaphore信號量)、自定義相等比較(custom equality comparison)、測試驅(qū)動開發(fā)(testdriven development)、泛型(generic)、擴展方法(extension method)和LINQ這些知識。 (5) “服務(wù)層”,就是實現(xiàn)服務(wù)層的類。在這部分中,將介紹從頭開始時編寫的服務(wù)層,討論反射(reflection)、模擬(mocking)、耦合(coupling)、運行時斷言(runtime assertion)、類型檢查(type check)、錯誤處理(error handling)、結(jié)構(gòu)體(struct)和生成式返回(yield return)。 (6) “控制器層”,第6部分是重寫代碼倉庫的最后一步。在這部分中,將介紹如何編寫兩個控制器類,以及執(zhí)行驗收測試。除了這些內(nèi)容,還將介紹 ASP.NET Core中間件(middleware)、HTTP路由、自定義數(shù)據(jù)綁定、數(shù)據(jù)序列化和反序列化,以及在運行時生成的OpenAPI說明書。 本書的很多章節(jié)(包括章節(jié)中的很多小節(jié))中,都包含了測試您知識水平的小練習(xí),這些練習(xí)可以很快地完成。我真誠建議您完成這些練習(xí)時,同時記得復(fù)習(xí)您覺得自己理解不透徹的知識點。 圖1流程圖(全書)圖1為建議閱讀本書的流程圖。按照這個流程圖閱讀本書,認(rèn)真學(xué)習(xí),可以達(dá)到理想的閱讀效果。該流程圖的靈感來自The Art of Computer Programming series(Donald Knuth)一書。 本書主要情況簡介像C#高手一樣編程本書中介紹的相關(guān)代碼 在編寫代碼的時候,可以將.NET分為3個主要分支:.NET框架4.x,.NET Core3.x和.NET5。除了第3章和第4章(閱讀之后您會明白為什么),本書均以.NET5為對象進(jìn)行編寫。 本書以C#語言版本中C#3和C#9為例進(jìn)行講解(如您使用的是C#8也是可以的)。C#語言是向下兼容的,您只要安裝最新版本的C#(在撰寫本書時,最新版本為C#8或C#9預(yù)覽版)對照學(xué)習(xí)就可以。介紹源代碼的章有第2章、第3和4(合并)章、第5章、第6章、第7章、第8章、第9章、第10章、第11章、第12章、第13章和第14章。 如要練習(xí)運行這些源代碼,需要安裝高于3.5版本的.NET框架(如果想要運行第3章和第4章的代碼)和.NET5。如果想要“本地運行”本書中所提到的數(shù)據(jù)庫,或是在實際安裝時遇到困難,可以參考附錄C(“安裝指南”)中的安裝說明。本書主要使用Visual Studio作為IDE,但是您也可以使用任何自己喜歡的、支持C#語言的IDE。Visual Studio 2019有一個免費的社區(qū)版本供我們使用,當(dāng)必須使用Visual Studio的情況時,本書會有提示。代碼和.NET5應(yīng)當(dāng)在Windows、macOS或Linux上運行。本書中盡可能使用命令行(對于macOS用戶來說是終端),以避免大家依賴于任何特定的IDE或操作系統(tǒng)。 本書中有很多源代碼示例,它們有可能是帶有編號的代碼示例,也有可能是與常規(guī)文本混合在一起的,這兩種情況,源代碼都采用了固定寬度字體,以將其與普通文本區(qū)分開。有時代碼名稱還會加粗,以突出顯示在之前步驟基礎(chǔ)上發(fā)生修改的代碼,比如將新功能添加至現(xiàn)有代碼行時,會將新功能名稱加粗。 在很多情況下,源代碼已經(jīng)被重新格式化,添加了換行符并修改了縮進(jìn),這是為了以盡可能符合書籍的排版。還有些處理得仍然還不夠好,代碼示例中還會包含行延續(xù)標(biāo)記()。本書中很多代碼示例中都包含了代碼注釋,用以強調(diào)重要的概念。另外,請大家注意,新代碼塊的大括號通常被放置在前一行上,這并不符合C#在實際應(yīng)用中的習(xí)慣,但是在本書中,這樣做可以有效節(jié)約空間,本書提供的源代碼本身并不會使用這一形式。 與本書相關(guān)的論壇 購買本書的讀者可以免費訪問Manning出版社運營的網(wǎng)絡(luò)論壇,您可以在論壇上發(fā)表關(guān)于本書的評論,詢問技術(shù)問題,以獲得幫助。如要訪問論壇,請登錄https://livebook.manning.com/book/codelikeaproincsharp/welcome/v9/。您還可以在https:// livebook.manning.com/#!/discussion中了解更多有關(guān)Manning論壇的信息以及行為準(zhǔn)則。 Manning出版社僅為讀者提供一個環(huán)境平臺,讓讀者與讀者,讀者與作者能夠方便溝通。對于論壇,作者并沒有承諾在論壇中的參與程度,其對論壇的貢獻(xiàn)是自愿和無償?shù)。我們希望讀者盡可能詢問一些具有建設(shè)性的問題,這樣作者也更有興趣解答。本書一經(jīng)出版,出版社的論壇和相關(guān)資料都可以訪問和查詢。
Jort Rodenburg是一名專門從事C#的軟件工程師,他為許多領(lǐng)域的應(yīng)用構(gòu)建軟件。同時,Jort還是一名教授,他指導(dǎo)并教授面向?qū)ο缶幊痰恼n程,以幫助開發(fā)人員掌握C#和.NET。
第1部分使用C#和 .NET第1章C#和.NET相關(guān)概念及使用說明3 1.1 C#的優(yōu)勢4 1.1.1 C#的經(jīng)濟(jì)性5 1.1.2 C#的可維護(hù)性5 1.1.3C#的易于操作性6 1.2為什么有時不使用C#7 1.2.1操作系統(tǒng)開發(fā)7 1.2.2嵌入式開發(fā)7 1.2.3數(shù)值計算8 1.3C#使用入門8 1.4本書涉及C#的主要內(nèi)容10 1.5本書不涉及的C#的內(nèi)容11 1.6總結(jié)12 第2章.NET及其編譯13 2.1.NET框架14 2.2.NET514 2.3兼容CLI的語言的編譯15 2.3.1C#代碼(高級語言)的編譯17 2.3.2通用中間語言(匯編層)的編譯19 2.3.3本地代碼(處理器層)的處理26 2.4練習(xí)27 2.5總結(jié)28 第2部分現(xiàn)有代碼庫第3章這個代碼有多糟糕33 3.1飛翔荷蘭人航空公司簡介34 3.2應(yīng)用代碼庫的基本要求35 3.2.1映射對象關(guān)系35 3.2.2GET/flight 終端地址——檢索所有航班的信息36 3.2.3GET/flight/ 終端地址——獲取特定航班信息37 3.2.4POST/booking/終端地址——預(yù)定航班38 3.3保存部分現(xiàn)有代碼40 3.3.1評估現(xiàn)有數(shù)據(jù)庫架構(gòu)及數(shù)據(jù)表40 3.3.2現(xiàn)有代碼庫的網(wǎng)絡(luò)服務(wù)配置文件41 3.3.3查看現(xiàn)有代碼庫中的模型和視圖47 3.4總結(jié)54 第4章非托管資源管理55 4.1FlightController——GET/flight56 4.1.1GET/flight終端地址以及它的功能56 4.1.2方法簽名——響應(yīng)類型的含義和typeof58 4.1.3使用集合收集航班信息60 4.1.4使用連接字符串的弊端61 4.1.5使用IDisposable釋放托管資源61 4.1.6使用SqlCommand查詢數(shù)據(jù)庫63 4.2FlightController: GET/flight/{flightNumber}66 4.3FlightController: POST/flight69 4.4The FlightController: DELETE/flight/{flightNumber}74 4.5練習(xí)75 4.6總結(jié)76 目錄像C#高手一樣編程第3部分?jǐn)?shù)據(jù)庫訪問層第5章使用Entity Framework Core設(shè)置項目和數(shù)據(jù)庫79 5.1創(chuàng)建.NET5解決方案和項目80 5.2設(shè)置和配置網(wǎng)絡(luò)服務(wù)84 5.2.1配置一個.NET5網(wǎng)絡(luò)服務(wù)84 5.2.2創(chuàng)建和使用HostBuilder86 5.2.3創(chuàng)建Startup文件89 5.2.4使用存儲/服務(wù)模式作為網(wǎng)絡(luò)服務(wù)架構(gòu)92 5.3構(gòu)建數(shù)據(jù)庫訪問層93 5.3.1Entity Framework Core和逆向94 5.3.2DbSet和Entity Framework Core工作流程96 5.3.3配置方法和環(huán)境變量97 5.3.4Windows中環(huán)境變量設(shè)置98 5.3.5macOS中環(huán)境變量設(shè)置99 5.3.6通過代碼檢索運行環(huán)境變量99 5.4練習(xí)102 5.5總結(jié)103 第4部分存儲層第6章測試驅(qū)動開發(fā)和依賴注入107 6.1測試驅(qū)動開發(fā)108 6.2CreateCustomer方法112 6.2.1驗證輸入?yún)?shù)113 6.2.2使用arrange、act和assert流程編寫單元測試114 6.2.3無效字符的驗證115 6.2.4具有\(zhòng)[DataRow\]屬性的內(nèi)聯(lián)測試117 6.2.5對象初始化器和自動生成代碼118 6.2.6構(gòu)造器、反射和異步編程120 6.2.7lock鎖、mutex互斥鎖和semaphore信號量122 6.2.8同步執(zhí)行轉(zhuǎn)換到異步執(zhí)行123 6.2.9Entity Framework Core測試124 6.2.10依賴注入控制依賴關(guān)系的使用126 6.3練習(xí)132 6.4總結(jié)133 第7章對象比較134 7.1GetCustomerByName方法135 7.1.1可空類型及其應(yīng)用137 7.1.2LINQ和擴展方法137 7.2C#的由來142 7.2.1應(yīng)用EqualityComparer創(chuàng)建“比較器”類144 7.2.2覆蓋Equals測試等價性146 7.2.3重載等價運算符147 7.3練習(xí)150 7.4總結(jié)151 第8章stub泛型和耦合153 8.1Booking存儲庫的實現(xiàn)154 8.2關(guān)注點分離與耦合156 8.3對象初始化器的使用160 8.4stub單元測試的使用163 8.5泛型編程的使用167 8.6使用可選參數(shù)提供默認(rèn)參數(shù)169 8.7條件語句、Func和switch表達(dá)式171 8.7.1三元條件運算符171 8.7.2使用函數(shù)數(shù)組進(jìn)行分支172 8.7.3switch語句和表達(dá)式173 8.7.4Entity Framework Core中的待處理更改查詢174 8.8練習(xí)177 8.9總結(jié)179 第9章擴展方法、流和抽象類181 9.1Airport存儲庫的實現(xiàn)182 9.2Airport對象的獲取——通過機場ID數(shù)據(jù)庫183 9.3AirportID輸入?yún)?shù)的驗證185 9.4輸出流186 9.5Airport對象的獲取——通過數(shù)據(jù)庫查詢191 9.6Flight存儲庫的實現(xiàn)199 9.6.1IsPositive擴展方法和“魔法數(shù)字”201 9.6.2數(shù)據(jù)庫中航班的獲取206 9.7練習(xí)209 9.8總結(jié)210 第5部分服務(wù)層第10章反射和模擬213 10.1回顧存儲/服務(wù)模式214 10.1.1服務(wù)類的用途是什么?215 10.2實現(xiàn)CustomerService216 10.2.1為成功做準(zhǔn)備——創(chuàng)建類骨架216 10.2.2刪除自己代碼的方法217 10.3BookingService的實現(xiàn)219 10.3.1跨架構(gòu)層的單元測試223 10.3.2stub和mock的區(qū)別224 10.3.3Moq庫模擬類的使用225 10.3.4存儲庫調(diào)用231 10.4練習(xí)233 10.5總結(jié)236 第11章運行類型檢查回顧和錯誤處理237 11.1驗證服務(wù)層方法的輸入?yún)?shù)238 11.1.1is和as運算符的運行類型檢查241 11.1.2is運算符的類型檢查242 11.1.3as運算符的類型檢查243 11.1.4驗證服務(wù)層方法總結(jié)244 11.2BookingServiceTests類清理244 11.3服務(wù)類中的外鍵約束247 11.3.1Flight存儲庫的調(diào)用248 11.4練習(xí)260 11.5總結(jié)261 第12章IAsyncEnumerable和yield return的使用262 12.1程序需要AirportService類嗎?263 12.2FlightService類的實現(xiàn)264 12.2.1通過FlightRepository獲取特定航班信息264 12.2.2數(shù)據(jù)流視圖組合268 12.2.3trycatch代碼塊與yield return使用276 12.2.4GetFlightByFlightNumber的實現(xiàn)281 12.3練習(xí)287 12.4總結(jié)288 第6部分控制器層第13章中間件、HTTP路由以及其響應(yīng)293 13.1存儲/服務(wù)模式中的控制器類294 13.2決定要實現(xiàn)的控制器類別296 13.3FlightController的實現(xiàn)297 13.3.1HTTP響應(yīng)(GetFlights)的返回298 13.3.2使用中間件將依賴項注入控制器301 13.3.3GET/Flight/{FlightNumber}終端地址實現(xiàn)310 13.4將HTTP請求路由至控制器和方法314 13.5練習(xí)319 13.6總結(jié)320 第14章 JSON序列化/反序列化以及自定義模型的綁定321 14.1BookingController類的實現(xiàn)322 14.1.1數(shù)據(jù)反序列化簡介323 14.1.2使用\[FromBody\]特性反序列化傳入的HTTP數(shù)據(jù)327 14.1.3自定義模型綁定器及其對應(yīng)方法特性的使用328 14.1.4CreateBooking終端地址方法邏輯的實現(xiàn)332 14.2驗收測試及添加Swagger中間件337 14.2.1OpenAPI的手動驗收測試338 14.2.2生成OpenAPI規(guī)范342 14.3結(jié)束語348 14.4總結(jié)348 附錄A練習(xí)答案349 附錄B整潔代碼檢查表355 附錄C安裝指南357 附錄DOpenAPI360 附錄E閱讀列表363
你還可能感興趣
我要評論
|