dotnet 2025年1月9日

.NET in Action 第二版

.NET实战(第二版)
书籍封面

.NET in Action 第二版

作者:Dustin Metzgar 出版日期:2024-06-18 出版社:Manning
本书涵盖了.NET平台的方方面面,从基础概念到高级应用都有涉及。书中详细介绍了C#编程语言和.NET运行时的核心功能,包括构建控制台应用程序、创建Web服务、使用Entity Framework Core以及进行单元测试和集成测试等。此外,文档还阐述了.NET在游戏开发、性能调优和安全方面的应用,并探讨了容器化和全球化等主题。最后,附录部分简要介绍了MAUI和Blazor框架。

这本书涵盖了 .NET 开发的各个方面,从基础语法、数据处理、Web 开发到测试、安全、性能和部署。通过学习这本书,可以全面掌握 .NET 开发技能,构建高质量的应用程序。

第一部分:基础知识

* 第一章:为何选择 .NET?

*   .NET 是一个跨平台的、功能全面的生态系统,不再被视为“不完整”的版本。
*   .NET 统一了之前的 .NET Framework 和 .NET Core,.NET 5 标志着这一转变。
*   .NET 包含运行时环境(CoreCLR)和基础类库(CoreFX)。
*   **中间语言 (IL)**:C#、F# 和 Visual Basic 等语言编译成中间语言,而不是直接编译成机器码,使得代码可以在任何具有 .NET 运行时的操作系统和处理器上运行。
*   **即时编译 (JIT)**:.NET 运行时包含一个编译器,将中间语言快速翻译成机器码。
*  **本章重点介绍了.NET 的核心概念,包括其跨平台特性、运行时环境和编译过程。**

* 第二章:构建控制台应用程序

*   **命名空间和约定**: .NET 6 及更高版本采用极简风格,减少了样板代码,`Program.cs` 文件中不再需要 `Main` 方法,而是直接使用顶层语句。
*   **using 语句**: `using` 语句用于引入命名空间,允许在代码中使用该命名空间的类型,而无需使用完全限定名。
*   **全局 using 语句**: 通过在 `.csproj` 文件中添加 `<Using>` 元素,可以定义全局 `using` 语句,减少代码文件顶部的样板代码。
*   **静态 using 语句**: 静态 `using` 语句允许直接访问类型的静态成员,而无需写出类型名称。
*   **C# 属性**: C# 属性通过 `get` 和 `set` 访问器提供对类数据的控制。`init` 访问器允许属性仅在对象构造时设置。
*   **命令行参数解析**: 可以使用 NuGet 包 `CommandLineParser` 来处理命令行参数。
*  **匿名函数**: 使用 lambda 表达式可以创建匿名函数,简化代码。
*  **插值字符串**:  允许将值嵌入字符串中,提高代码可读性。
*  **空运算符**:  包括 `?.` (空条件运算符)和 `??`(空合并运算符),可以简洁地处理空值。
*  **本章通过构建一个简单的 ASCII 艺术生成器,介绍了 C# 的基础语法和 .NET 的核心概念。**

第二部分:数据

* 第四章:文件和网络 I/O

*   **文件读写**: 使用 `StreamReader` 和 `StreamWriter` 进行文件读写操作。使用 `using` 语句来确保 `StreamReader` 的正确释放。
*   **JSON 处理**: 使用 `JsonDocument` 读取 JSON 文档,使用 `Utf8JsonWriter` 写入 JSON 文档。
*   **HTTP 请求**: 使用 `HttpClient` 发起 HTTP 请求。
*   **异步编程**: 使用 `async` 和 `await` 关键字进行异步编程,避免阻塞线程。
*   **本章介绍了如何在 .NET 中进行文件读写、JSON 处理和网络请求,并初步接触了异步编程。**

第三部分:ASP.NET Core 应用

* 第三章:使用 ASP.NET Core 创建 Web 服务和应用程序

*   **Web 服务**: 使用 ASP.NET Core 的最小 API 创建 Web 服务,使用路由机制参数化 URL。
*   **响应控制**: 使用 `ActionResult` 控制 HTTP 响应代码。
*   **Web 应用程序**: 使用 Razor 页面创建 Web 应用程序,使用 `PageModel` 处理请求。
*   **本章介绍了如何使用 ASP.NET Core 构建 Web 服务和应用程序,以及如何控制响应和处理用户输入。**
  • 第五章:使用 EF Core 访问数据库
    • 实体关系: 介绍了一对一关系的建模,其中一个实体(Book)可以可选地拥有另一个实体(Rating)。
    • 数据初始化: 讨论了如何在数据库上下文中添加和更新实体。
    • 通过 Swagger/OpenAPI 公开 API: 介绍了如何使用 Swagger UI 来文档化和测试 Web API, 方便用户理解和使用。
    • 本章介绍了如何使用 EF Core 建立数据库,并如何通过WebAPI公开接口。

第四部分:测试和质量

* 第六章:单元测试基础

*   **SOLID 原则**: 介绍了 SOLID 设计原则,帮助编写易于测试和维护的代码。
*   **xUnit 测试框架**: 介绍了 xUnit 测试框架,以及如何使用 Fact 和 Theory 测试。
*   **断言**: 使用 `Assert` 类进行断言,验证测试结果。
*   **本章介绍了单元测试的基本概念和技巧,并重点讲解了 xUnit 框架的使用方法。**

* 第七章:在测试中替换依赖

*   **依赖注入**:  通过依赖注入来解耦,使代码更易于测试。
*    **内存流**: 使用内存流来模拟文件流,方便测试。
*   **伪造对象**: 使用 `FakeItEasy` 库来创建伪造对象,模拟依赖行为。
*   **AAA 模式**: 强调在单元测试中使用 Arrange、Act 和 Assert 模式。
*  **本章重点讲解了如何使用伪造对象和依赖注入来提高测试的效率和可靠性。**

* 第八章:集成测试

*   **集成测试**: 介绍了集成测试的概念,以及如何测试组件之间的交互。
*   **模拟 HTTP 调用**:  使用 `HttpMessageHandler` 模拟 HTTP 调用,方便测试。
*    **SQLite 内存数据库**: 介绍了如何使用 SQLite 内存数据库进行测试。
*  **本章介绍了如何进行集成测试,包括测试数据库操作和外部服务调用。**

第五部分:发布准备

* 第九章:安全

*   **威胁建模**: 介绍了威胁建模的概念,以及如何分析系统中的安全漏洞。
*   **身份验证和授权**: 介绍了如何使用 ASP.NET Core Identity 进行身份验证和授权。
*    **JWT**: 介绍了 JWT 的结构和用途,包括 header、payload 和 signature。
*  **本章重点讲解了如何识别安全风险,以及如何在 .NET 中实现身份验证和授权。**
*  **第十章:性能**
   *  **垃圾回收机制**: 介绍了垃圾回收机制,解释了堆的碎片化及其对性能的影响。
   * **性能测试工具**:  介绍了 NBomber,一个用于进行 Web 性能测试的工具。
 *  **本章介绍了影响性能的因素,包括垃圾回收机制和性能测试工具。**

* 第十一章:处理失败

*   **事务性更新**: 介绍了如何进行事务性数据库更新,确保数据一致性。
*   **重试策略**: 介绍了使用 Polly 库进行重试操作,处理瞬时错误。
*   **本章重点讲解了如何在应用程序中处理失败,并提高系统的健壮性。**

* 第十二章:构建世界就绪的应用程序

*   **国际化 (i18n)**:介绍了国际化的三个步骤:全球化 (g11n)、本地化审查 (l12y) 和本地化 (l10n)。
*   **全球化**: 确保应用程序能够处理不同文化和语言。
*   **本地化**: 将应用程序翻译成不同的语言。
*   **本地化审查**: 确保应用程序为本地化做好准备。
*   **本章介绍了如何构建世界就绪的应用程序,并支持不同的文化和语言。**

* 第十三章:使用容器

*   **容器化**: 介绍了如何使用 Dockerfile 构建容器镜像。
*   **.NET 7 及更高版本的容器支持**:  使用 .NET 7 及更高版本的内置容器发布功能。
*   **多阶段构建**: 使用多阶段构建来减小镜像大小。
*   **配置**: 使用 `appsettings.json` 和环境变量进行配置。
*   **本章介绍了如何使用容器技术来部署和管理应用程序。**

附录

  • 附录 C:MAUI 和 Blazor
  • .NET MAUI 和 Blazor 是用于构建跨平台应用程序的技术。
  • 附录 D:异步状态机
  • 解释了 asyncawait 关键字在 C# 中的工作原理,以及编译器如何处理它们。
  • 附录 E:测试内部成员
  • 讨论了在单元测试中如何测试内部成员,这通常用于代码重构。
  • 附录 F:xUnit 补充
    • 使用特性来区分单元测试和集成测试。