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