像C#高手一樣編程 Code Like a Pro in C#

Jort Rodenburg 譯毛鴻燁 吳曉梅

買這商品的人也買了...

商品描述

本書將會討論一些C#編程重要的後端技能,
並且在典型情形(重構一個代碼庫,以確保其安全,整潔和可讀)中練習應用這些技能。
本書包括6部分,
第1部分位基礎知識講解,
第2部分為代碼設計和改進,
第3部分為訪問數據庫,
第4部分為存儲模式,
第5部分為服務層講解,
第6部分為控制器類講解。
在完成這些內容和練習之後,讀者將對C#語言具有更深刻的理解,
並且可以準備學習更高水平的內容。

作者簡介

Jort Rodenburg
是一名專門從事C#的軟件工程師,他為許多領域的應用構建軟件。
同時,Jort還是一名教授,他指導並教授面向對象編程的課程,以幫助開發人員掌握C#和.NET。

目錄大綱

第1部分使用C#和.NET第1章C#和.NET相關概念及使用說明3
1.1 C#的優勢4
1.1.1 C#的經濟性5
1.1.2 C#的可維護性5
1.1.3C#的易於操作性6
1.2為什麼有時不使用C#7
1.2.1操作系統開發7
1.2.2嵌入式開發7
1.2.3數值計算8
1.3C#使用入門8
1.4本書涉及C#的主要內容10
1.5本書不涉及的C#的內容11
1.6總結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練習27
2.5總結28
第2部分現有代碼庫第3章這個代碼有多糟糕33
3.1飛翔荷蘭人航空公司簡介34
3.2應用代碼庫的基本要求35
3.2.1映射對象關係35
3.2.2GET/flight 終端地址——檢索所有航班的信息36
3.2.3GET/flight/ 終端地址——獲取特定航班信息37
3.2.4POST/booking/終端地址——預定航班38
3.3保存部分現有代碼40
3.3.1評估現有數據庫架構及數據表40
3.3.2現有代碼庫的網絡服務配置文件41
3.3.3查看現有代碼庫中的模型和視圖47
3.4總結54
第4章非託管資源管理55
4.1FlightController——GET/flight56
4.1.1GET/flight終端地址以及它的功能56
4.1.2方法簽名——響應類型的含義和typeof58
4.1.3使用集合收集航班信息60
4.1.4使用連接字符串的弊端61
4.1.5使用IDisposable釋放託管資源61
4.1.6使用SqlCommand查詢數據庫63
4.2FlightController: GET/flight/{flightNumber}66
4.3FlightController: POST/flight69
4.4The FlightController: DELETE/flight/{flightNumber}74
4.5練習75
4.6總結76
目錄像C#高手一樣編程第3部分數據庫訪問層第5章使用Entity Framework Core設置項目和數據庫79
5.1創建.NET5解決方案和項目80
5.2設置和配置網絡服務84
5.2.1配置一個.NET5網絡服務84
5.2.2創建和使用HostBuilder86
5.2.3創建Startup文件89
5.2.4使用存儲/服務模式作為網絡服務架構92
5.3構建數據庫訪問層93
5.3.1Entity Framework Core和逆向94
5.3.2DbSet和Entity Framework Core工作流程96
5.3.3配置方法和環境變量97
5.3.4Windows中環境變量設置98
5.3.5macOS中環境變量設置99
5.3.6通過代碼檢索運行環境變量99
5.4練習102
5.5總結103
第4部分存儲層第6章測試驅動開發和依賴注入107
6.1測試驅動開發108
6.2CreateCustomer方法112
6.2.1驗證輸入參數113
6.2.2使用arrange、act和assert流程編寫單元測試114
6.2.3無效字符的驗證115
6.2.4具有\[DataRow\]屬性的內聯測試117
6.2.5對像初始化器和自動生成代碼118
6.2.6構造器、反射和異步編程120
6.2.7lock鎖、mutex互斥鎖和semaphore信號量122
6.2.8同步執行轉換到異步執行123
6.2.9Entity Framework Core測試124
6.2.10依賴注入控制依賴關係的使用126
6.3練習132
6.4總結133
第7章對像比較134
7.1GetCustomerByName方法135
7.1.1可空類型及其應用137
7.1.2LINQ和擴展方法137
7.2C#的由來142
7.2.1應用EqualityComparer創建“比較器”類144
7.2.2覆蓋Equals測試等價性146
7.2.3重載等價運算符147
7.3練習150
7.4總結151
第8章stub泛型和耦合153
8.1Booking存儲庫的實現154
8.2關注點分離與耦合156
8.3對像初始化器的使用160
8.4stub單元測試的使用163
8.5泛型編程的使用167
8.6使用可選參數提供默認參數169
8.7條件語句、Func和switch表達式171
8.7.1三元條件運算符171
8.7.2使用函數數組進行分支172
8.7.3switch語句和表達式173
8.7.4Entity Framework Core中的待處理更改查詢174
8.8練習177
8.9總結179
第9章擴展方法、流和抽像類181
9.1Airport存儲庫的實現182
9.2Airport對象的獲取——通過機場ID數據庫183
9.3AirportID輸入參數的驗證185
9.4輸出流186
9.5Airport對象的獲取——通過數據庫查詢191
9.6Flight存儲庫的實現199
9.6.1IsPositive擴展方法和“魔法數字”201
9.6.2數據庫中航班的獲取206
9.7練習209
9.8總結210
第5部分服務層第10章反射和模擬213
10.1回顧存儲/服務模式214
10.1.1服務類的用途是什麼?215
10.2實現CustomerService216
10.2.1為成功做準備——創建類骨架216
10.2.2刪除自己代碼的方法217
10.3BookingService的實現219
10.3.1跨架構層的單元測試223
10.3.2stub和mock的區別224
10.3.3Moq庫模擬類的使用225
10.3.4存儲庫調用231
10.4練習233
10.5總結236
第11章運行類型檢查回顧和錯誤處理237
11.1驗證服務層方法的輸入參數238
11.1.1is和as運算符的運行類型檢查241
11.1.2is運算符的類型檢查242
11.1.3as運算符的類型檢查243
11.1.4驗證服務層方法總結244
11.2BookingServiceTests類清理244
11.3服務類中的外鍵約束247
11.3.1Flight存儲庫的調用248
11.4練習260
11.5總結261
第12章IAsyncEnumerable和yield return的使用262
12.1程序需要AirportService類嗎?263
12.2FlightService類的實現264
12.2.1通過FlightRepository獲取特定航班信息264
12.2.2數據流視圖組合268
12.2.3trycatch代碼塊與yield return使用276
12.2.4GetFlightByFlightNumber的實現281
12.3練習287
12.4總結288
第6部分控制器層第13章中間件、HTTP路由以及其響應293
13.1存儲/服務模式中的控制器類294
13.2決定要實現的控制器類別296
13.3FlightController的實現297
13.3.1HTTP響應(GetFlights)的返回298
13.3.2使用中間件將依賴項注入控制器301
13.3.3GET/Flight/{FlightNumber}終端地址實現310
13.4將HTTP請求路由至控制器和方法314
13.5練習319
13.6總結320
第14章JSON序列化/反序列化以及自定義模型的綁定321
14.1BookingController類的實現322
14.1.1數據反序列化簡介323
14.1.2使用\[FromBody\]特性反序列化傳入的HTTP數據327
14.1.3自定義模型綁定器及其對應方法特性的使用328
14.1.4CreateBooking終端地址方法邏輯的實現332
14.2驗收測試及添加Swagger中間件337
14.2.1OpenAPI的手動驗收測試338
14.2.2生成OpenAPI規範342
14.3結束語348
14.4總結348
附錄A練習答案349
附錄B整潔代碼檢查表355
附錄C安裝指南357
附錄DOpenAPI360
附錄E閱讀列表363