书籍详情
C#与.NET 6开发从入门到实践
作者:敖瑞
出版社:清华大学出版社
出版时间:2023-03-01
ISBN:9787302621980
定价:¥169.00
购买这本书可以去
内容简介
本书以ASP.NET Core项目为例,系统地介绍了.NET6的各个重要知识点。书中内容融合了作者多年实践的丰富经验,讲解深入浅出,全面且细致。 本书共分为四篇25章。第一篇(第1~3章)是.NET 6基础篇,主要介绍.NET平台、C#语言和Visual Studio开发环境的常用功能和特性。第二篇(第4~10章)是Entity Framework Core篇,主要介绍Entity Framework Core的各种功能和使用方法,包括快速入门、实体模型、实体模型的关系、管理实体模型和数据库架构、管理数据、查询数据、Entity Framework Core共享功能等内容。第三篇(第11~24章)是ASP.NET Core篇,主要介绍ASP.NET Core框架的基础知识、身份认证、授权、MVC、Razor Pages、Blazor、Razor类库、Web API、远程过程调用、实时通信、应用安全、高级功能等内容。第四篇(第25章)是实战演练篇,用一个功能完整的电子商城项目来串联前面三篇介绍的大部分功能,帮助读者跨越从基础知识的学习到实际应用的门槛。 本书以.NET 6的入门学习者和有其他C系语言的使用经验并有意了解ASP.NET Core的人为主要目标读者,同时适合被中高级开发者当作功能模块速查和学习高级功能的手册,还可以作为高等院校相关专业的教学用书和培训学校的教材。
作者简介
敖瑞,网络工程专业,中级软件设计师,从业5年,资深软件工程师,主要从事系统开发,精通C# .NET开发,同时熟悉JavaScript和Web前端开发。在国内开发者论坛分享学习思考心得,参与开源社区项目的完善。
目录
第一篇 .NET 6基础
第1章 构建.NET 6开发环境 3
1.1 .NET、.NET Core、.NET Standard与.NET Framework 3
1.2 ASP.NET Core与ASP.NET 4
1.3 其他.NET应用模型 4
1.4 Visual Studio简介 4
1.5 安装Visual Studio 5
1.6 小结 7
第2章 Visual Studio的解决方案和项目 8
2.1 解决方案和项目简介 8
2.2 创建解决方案和项目 8
2.2.1 创建方法 8
2.2.2 操作演示和说明 9
2.3 引用其他项目和第三方程序包 12
2.3.1 引用其他项目 12
2.3.2 引用第三方程序包 13
2.3.3 卸载程序包和项目引用 16
2.4 .NET主要项目类型 16
2.5 解决方案和项目文件解析 16
2.5.1 解决方案文件 16
2.5.2 项目文件 17
2.6 小结 18
第3章 C#发展史 19
3.1 简介 19
3.2 C# 1.0 19
3.2.1 类、结构体和联合体 20
3.2.2 接口 22
3.2.3 属性 23
3.2.4 委托 26
3.2.5 事件 28
3.2.6 运算符和表达式 29
3.2.7 语句 31
3.2.8 命名空间 31
3.2.9 特性 32
3.2.10 unsafe上下文 33
3.3 C# 2.0 35
3.3.1 泛型 35
3.3.2 协变和逆变 38
3.3.3 委托的方法组转换 39
3.3.4 分部类型 39
3.3.5 匿名方法 40
3.3.6 可为null的结构体 40
3.3.7 枚举器 41
3.3.8 静态类 41
3.3.9 独立的属性访问器保护级别 43
3.3.10 委托类型推断 43
3.4 C# 3.0 44
3.4.1 自动实现属性 44
3.4.2 分部方法 44
3.4.3 对象初始化器 45
3.4.4 隐式类型的本地变量 45
3.4.5 匿名类型 46
3.4.6 Lambda表达式 46
3.4.7 表达式树 47
3.4.8 扩展方法 47
3.4.9 LINQ(Language-Integrated Query) 48
3.5 C# 4.0 50
3.5.1 动态绑定 50
3.5.2 可选参数和命名参数 50
3.5.3 嵌入的互操作类型 51
3.5.4 泛型的协变和逆变 51
3.6 C# 5.0 52
3.6.1 调用方信息特性 52
3.6.2 异步成员 52
3.7 C# 6.0 53
3.7.1 静态导入 53
3.7.2 异常筛选器 54
3.7.3 表达式体成员 54
3.7.4 自动属性初始化表达式 55
3.7.5 索引初始化器 55
3.7.6 null引用传播运算符 55
3.7.7 字符串内插 56
3.7.8 nameof运算符 57
3.7.9 catch和finally块中的await 57
3.7.10 Roslyn 57
3.8 C# 7.0 60
3.8.1 out变量 60
3.8.2 元组、解构和弃元 60
3.8.3 模式匹配 61
3.8.4 本地函数 62
3.8.5 表达式体成员增强 63
3.8.6 二进制文本和数字分隔符 63
3.8.7 throw表达式 63
3.8.8 ref局部变量和返回值 63
3.9 C# 7.1 64
3.9.1 异步主函数 64
3.9.2 default表达式 64
3.9.3 元组元素名称推断 65
3.9.4 泛型类型参数的模式匹配 65
3.10 C# 7.2 65
3.10.1 非尾随命名参数 65
3.10.2 数值文本的前导下画线 66
3.10.3 private protected访问修饰符 66
3.10.4 针对参数的in修饰符 66
3.10.5 针对方法返回值的ref readonly修饰符 67
3.10.6 readonly struct结构体 67
3.10.7 ref struct结构体 68
3.10.8 条件ref表达式 68
3.11 C# 7.3 68
3.11.1 非托管类型和泛型约束增强 68
3.11.2 无须固定即可访问固定的字段 69
3.11.3 可以重新分配ref局部变量 69
3.11.4 可以使用stackalloc数组上的初始值设定项 69
3.11.5 更多类型支持fixed语句 70
3.11.6 元组支持“==”和“!=”操作符 70
3.11.7 支持为自动实现属性的后台字段添加特性 70
3.11.8 增强包含in修饰符的方法重载的选择策略 70
3.11.9 扩展out变量的适用范围 71
3.11.10 改进方法重载的选择策略 71
3.12 C# 8.0 71
3.12.1 默认接口方法 71
3.12.2 模式匹配增强 72
3.12.3 结构体的readonly成员 75
3.12.4 using声明 75
3.12.5 静态本地函数 76
3.12.6 可释放的ref struct 76
3.12.7 可为null的引用类型 76
3.12.8 异步可释放 77
3.12.9 异步枚举器 78
3.12.10 索引和范围 79
3.12.11 null合并赋值 80
3.12.12 非托管泛型结构体 80
3.12.13 嵌套表达式中的stackalloc 80
3.12.14 内插字符串和逐字字符串 80
3.13 C# 9.0 81
3.13.1 init属性访问器 81
3.13.2 记录 81
3.13.3 顶级程序 83
3.13.4 模式匹配增强 84
3.14 本机大小的整数 85
3.14.1 函数指针 85
3.14.2 禁止本地初始化特性 86
3.14.3 静态匿名函数 87
3.14.4 类型推导的new表达式 87
3.14.5 类型推导的条件表达式 88
3.14.6 协变返回类型 88
3.14.7 foreach循环支持GetEnumerator扩展方法 88
3.14.8 参数弃元 89
3.14.9 本地函数支持特性 89
3.14.10 模块初始化器 90
3.14.11 分部方法增强 90
3.14.12 源生成器 91
3.15 C# 10.0 91
3.15.1 结构体记录 91
3.15.2 结构体允许自定义公共无参构造函数 91
3.15.3 强化的with表达式 92
3.15.4 记录允许密封ToString方法 92
3.15.5 全局using 92
3.15.6 文件范围的命名空间 93
3.15.7 常量内插字符串 93
3.15.8 内插字符串处理程序 93
3.15.9 Lambda表达式增强 93
3.15.10 CallerArgumentExpression诊断特性 94
3.15.11 解构支持混合使用已有变量和内联声明变量 94
3.15.12 增强的属性模式 94
3.15.13 方法上的自定义异步状态机特性 95
3.16 小结 95
第二篇 Entity Framework Core
第4章 快速入门 99
4.1 简介 99
4.2 创建项目和安装EF Core 99
4.3 创建数据模型 99
4.4 创建数据上下文 100
4.5 创建数据库 100
4.6 简单使用 101
4.7 小结 102
第5章 实体模型 103
5.1 实体类型和实体模型配置 103
5.1.1 基本实体类型 104
5.1.2 基础实体模型配置 105
5.1.3 排序规则 108
5.1.4 值生成和计算属性 109
5.1.5 影子属性 112
5.1.6 幕后字段 112
5.1.7 模型字段 113
5.1.8 键 114
5.1.9 索引 117
5.1.10 并发标记与行版本 118
5.1.11 值转换器 119
5.1.12 值比较器和属性快照 121
5.1.13 数据种子 123
5.1.14 构造函数 124
5.1.15 继承 127
5.1.16 无键实体类型 129
5.1.17 实体的多重映射 130
5.1.18 索引器属性、共享类型实体和属性包 131
5.2 全局查询过滤器 132
5.3 自定义实体模型注解 132
5.4 自定义数据库函数和映射 133
5.4.1 标量值函数映射 133
5.4.2 表值函数映射 134
5.4.3 存储过程映射 135
5.5 在一个上下文类型中使用多个模型 136
5.6 小结 137
第6章 实体模型的关系 138
6.1 概念和术语简介 138
6.2 实体模型的关系与影子属性 138
6.3 一对一关系 139
6.3.1 实体类型和关系配置 140
6.3.2 表共享(表拆分) 141
6.3.3 从属实体类型 142
6.4 一对多关系 143
6.4.1 实体类型和关系配置 143
6.4.2 自关联与树形实体类型 145
6.4.3 从属实体类型的集合 145
6.5 多对多关系 146
6.5.1 显式映射 146
6.5.2 隐式映射 148
6.6 模型关系的级联删除 149
6.7 小结 151
第7章 管理实体模型和数据库架构 152
7.1 迁移 152
7.1.1 安装迁移工具 153
7.1.2 管理迁移 154
7.1.3 应用迁移 155
7.1.4 自定义迁移操作 156
7.1.5 使用独立的迁移项目 162
7.1.6 为模型提供多个迁移 163
7.1.7 自定义迁移历史记录 164
7.2 逆向工程 165
7.3 EF Core Power Tools 165
7.4 小结 165
第8章 管理数据 166
8.1 基础保存 166
8.1.1 添加实体 166
8.1.2 更新实体 167
8.1.3 删除实体 168
8.1.4 订阅保存事件和注册保存拦截器 169
8.2 保存相关实体 170
8.2.1 同时添加多个相关实体 170
8.2.2 为主实体单独添加从实体 171
8.2.3 更改实体的关系 172
8.2.4 删除关系 173
8.3 并发冲突 174
8.4 事务 175
8.4.1 简单事务 175
8.4.2 跨上下文事务 176
8.4.3 使用外部事务 177
8.4.4 保存点 178
8.5 异步保存 178
8.6 实体跟踪器和实体追踪图 179
8.6.1 基础使用 179
8.6.2 订阅实体跟踪事件 180
8.7 小结 180
第9章 查询数据 181
9.1 基础查询 181
9.1.1 查询数据集合 181
9.1.2 查询单个数据 182
9.1.3 查询标量值 183
9.1.4 引用影子属性 183
9.1.5 查询标记 184
9.2 复杂查询 184
9.2.1 结果投影 184
9.2.2 连接查询 185
9.2.3 分组查询 187
9.2.4 临时禁用全局查询过滤器 188
9.3 原始SQL查询 188
9.4 映射的自定义函数 189
9.4.1 使用标量值函数 189
9.4.2 使用表值函数和存储过程 189
9.4.3 自定义方法转换 190
9.5 加载相关数据 191
9.5.1 预加载 191
9.5.2 延迟加载 192
9.5.3 显式加载 195
9.5.4 拆分查询 195
9.6 跟踪和非跟踪查询 196
9.7 显式编译查询 197
9.8 查看生成的SQL语句 197
9.9 服务端查询和客户端查询 198
9.10 命令拦截器 198
9.11 异步查询 199
9.12 小结 199
第10章 Entity Framework Core共享功能 200
10.1 配置上下文 200
10.1.1 日志记录 200
10.1.2 参数显示 201
10.1.3 全局默认拆分查询 201
10.1.4 全局默认基于标识解析的非跟踪查询 201
10.2 自动重试 201
10.3 内存数据库 202
10.4 小结 202
第三篇 ASP.NET Core
第11章 快速入门 205
11.1 简介 205
11.2 创建项目 205
11.3 小结 208
第12章 公共基础 209
12.1 依赖注入 209
12.1.1 概述 209
12.1.2 在控制台应用中使用依赖注入 210
12.1.3 在ASP.NET Core应用中使用依赖注入 214
12.1.4 EF Core中的依赖注入 216
12.1.5 面向切面编程 216
12.2 配置 223
12.2.1 简介 223
12.2.2 在控制台应用中使用配置 224
12.2.3 在ASP.NET Core应用中使用配置 224
12.3 选项 226
12.3.1 简介 226
12.3.2 具名选项 226
12.3.3 数据变更同步和变更事件 226
12.3.4 后期处理 226
12.3.5 选项验证 226
12.3.6 选项作用域 227
12.3.7 在控制台应用中使用选项 227
12.3.8 在ASP.NET Core应用中使用选项 232
12.3.9 利用依赖注入的选项 233
12.4 日志 234
12.4.1 日志类别 235
12.4.2 严重性级别 235
12.4.3 事件Id 235
12.4.4 消息模板 236
12.4.5 记录异常 236
12.4.6 作用域 236
12.4.7 运行时更改过滤器级别 236
12.4.8 在简单控制台应用中使用日志 236
12.4.9 记录提供程序 237
12.5 主机 238
12.5.1 托管服务 238
12.5.2 环境 240
12.5.3 通用主机 240
12.6 Web主机 243
12.6.1 托管到Windows服务和Linux服务 243
12.6.2 .NET后台服务 244
12.7 中间件和请求处理管道 245
12.7.1 中间件和请求处理管道的关系 245
12.7.2 终端中间件和管道短路 246
12.7.3 中间件的顺序 247
12.7.4 管道分支 248
12.7.5 内置中间件 249
12.7.6 自定义中间件 251
12.8 Startup类 254
12.8.1 基础使用 254
12.8.2 多环境Startup 255
12.8.3 Startup过滤器 256
12.8.4 .NET 6新增的最小配置API 258
12.9 静态文件 258
12.9.1 基础使用 258
12.9.2 目录浏览 259
12.9.3 静态文件授权 260
12.10 动态响应和静态资源压缩 260
12.10.1 动态响应压缩 260
12.10.2 静态资源压缩 261
12.11 缓存 261
12.11.1 客户端缓存 261
12.11.2 缓存服务和响应缓存中间件 262
12.11.3 页面数据缓存 264
12.12 流量控制 264
12.12.1 请求频率控制 264
12.12.2 响应发送速率控制 264
12.13 端点路由 279
12.13.1 传统路由回顾 279
12.13.2 端点路由简介 279
12.13.3 基础使用 280
12.13.4 链接生成 280
12.13.5 路由模板 281
12.13.6 路由约束 281
12.13.7 自定义约束 282
12.13.8 参数转换器 283
12.13.9 自定义端点 284
12.14 发送HTTP请求 289
12.14.1 基础使用 290
12.14.2 请求中间件 293
12.14.3 基于策略的处理程序和弹性故障处理 295
12.14.4 请求标头传播和分布式链路追踪 297
12.14.5 管理和使用Cookie 298
12.15 错误处理 299
12.16 托管和部署 301
12.17 小结 303
第13章 身份认证 304
13.1 基础身份认证 304
13.1.1 Cookie认证 304
13.1.2 JWT认证 308
13.1.3 自定义身份认证 313
13.1.4 接入第三方身份认证服务 314
13.2 ASP.NET Core Identity 318
13.2.1 基础使用 319
13.2.2 自定义用户数据 321
13.2.3 账户确认和密码重置 322
13.2.4 双因素身份验证和二维码生成 323
13.2.5 隐私数据保护 323
13.3 OpenIddict 329
13.3.1 OpenId Connect(OIDC)和OAuth协议简介 329
13.3.2 OpenIddict简介 332
13.3.3 基础使用 332
13.4 小结 340
第14章 授权 341
14.1 定义授权策略 341
14.2 配置授权策略 343
14.3 高级功能简介 345
14.3.1 授权策略提供程序 345
14.3.2 自定义授权结果的处理方式 345
14.4 小结 345
第15章 MVC 346
15.1 简介 346
15.1.1 MVC模式 346
15.1.2 ASP.NET Core MVC 347
15.2 模型 347
15.2.1 基础使用 347
15.2.2 自定义数据源 350
15.2.3 特殊数据类型 350
15.2.4 从模型绑定中排除特定类型 350
15.2.5 模型绑定的全球化 350
15.2.6 手动调用模型绑定 351
15.2.7 输入格式化器 351
15.2.8 为输入格式化器自定义特定类型的转换器 352
15.2.9 自定义模型绑定 352
15.2.10 模型验证 355
15.3 控制器和动作 359
15.3.1 基础使用 359
15.3.2 控制器和动作中的依赖注入 360
15.3.3 IActionResult 361
15.4 MVC过滤器 362
15.4.1 简介 362
15.4.2 授权过滤器 364
15.4.3 自定义过滤器 364
15.4.4 依赖注入 366
15.4.5 配置过滤器 367
15.5 视图 368
15.5.1 Razor引擎简介 368
15.5.2 基础Razor语法 368
15.5.3 特殊Razor文件 373
15.5.4 标签助手 374
15.5.5 视图组件 378
15.5.6 客户端模型验证 381
15.5.7 运行时视图编译 386
15.5.8 视图编码 386
15.5.9 视图发现 387
15.6 区域 388
15.7 MVC路由 389
15.7.1 传统路由 389
15.7.2 特性路由 390
15.7.3 路由参数转换器 391
15.8 应用程序模型 391
15.9 应用程序部件 392
15.10 小结 393
第16章 Razor Pages 394
16.1 简介 394
16.2 基础使用 395
16.3 页面处理器 396
16.3.1 默认约定 396
16.3.2 相关的Razor指令 397
16.3.3 后台代码 398
16.4 模型绑定 398
16.5 Razor Pages过滤器 399
16.5.1 全局配置 399
16.5.2 重写基类的方法 400
16.5.3 特性配置 400
16.6 Razor Pages路由 400
16.7 小结 401
第17章 Blazor 402
17.1 简介 402
17.2 公共基础 403
17.2.1 依赖注入 403
17.2.2 配置 404
17.2.3 启动 405
17.2.4 环境 407
17.2.5 路由 408
17.2.6 错误处理 408
17.3 Razor组件 410
17.3.1 相关的Razor指令 410
17.3.2 后台代码和分部类支持 411
17.3.3 输出原始HTML 412
17.3.4 依赖注入 412
17.3.5 路由和导航 413
17.3.6 组件参数 414
17.3.7 属性展开和任意参数 414
17.3.8 子内容 415
17.3.9 组件和元素引用 416
17.3.10 使用@key控制是否保留元素和组件 416
17.3.11 Razor模板 417
17.3.12 模板化组件 417
17.3.13 级联值和参数 419
17.3.14 数据绑定 421
17.3.15 事件处理 423
17.3.16 生命周期 425
17.3.17 组件渲染 427
17.3.18 虚拟滚动组件 428
17.3.19 动态组件 429
17.3.20 表单和验证 429
17.3.21 CSS隔离 429
17.3.22 常用内置组件简介 430
17.4 服务端预渲染 431
17.4.1 基础使用 431
17.4.2 保持组件状态 434
17.5 布局 437
17.6 发送HTTP请求 437
17.7 JavaScript互操作 437
17.7.1 从.NET调用JavaScript 438
17.7.2 从JavaScript调用.NET 439
17.8 状态管理 442
17.9 程序集延迟加载 443
17.9.1 基础使用 443
17.9.2 延迟加载的程序集中的可路由组件 444
17.10 渐进式Web应用 445
17.10.1 简介 445
17.10.2 启用PWA支持 445
17.11 调试 447
17.11.1 准备工作 447
17.11.2 启用调试 448
17.11.3 在浏览器中调试 448
17.12 托管和部署 450
17.12.1 常用发布选项 450
17.12.2 关于应用基地址和在同一个服务端同时托管多个应用的注意事项 451
17.12.3 AOT编译、IL裁剪和引用Native代码功能简介 462
17.13 小结 463
第18章 Razor类库 464
18.1 简介 464
18.2 静态资源组织 464
18.3 小结 465
第19章 Web API 466
19.1 基础使用 466
19.1.1 默认约定的API控制器 466
19.1.2 Web API路由 468
19.1.3 模型绑定 468
19.2 API版本、Open API和Swagger 469
19.2.1 多版本API 470
19.2.2 Swashbuckle 471
19.3 小结 473
第20章 远程过程调用 474
20.1 WCF回顾 474
20.2 gRPC 475
20.2.1 PROTO文件 475
20.2.2 服务端 475
20.2.3 客户端 478
20.2.4 在Blazor WebAssembly应用中使用gRPC-Web客户端 480
20.3 小结 481
第21章 实时通信 482
21.1 早期解决方案回顾 482
21.2 WebSocket简介 482
21.3 SignalR 483
21.3.1 集线器 483
21.3.2 流式连接 490
21.3.3 消息格式协议 492
21.3.4 应用承载力扩展 492
21.3.5 客户端 493
21.4 小结 507
第22章 应用安全 508
22.1 数据保护 508
22.1.1 基础使用 508
22.1.2 层次结构 510
22.1.3 时效性数据保护 510
22.2 管理机密 510
22.3 欧盟通用数据保护条例(GDPR) 511
22.4 防御恶意攻击 512
22.4.1 跨站点请求伪造(XSRF/CSRF) 513
22.4.2 开放重定向攻击 514
22.4.3 跨站点脚本攻击(XSS) 514
22.5 一般安全功能 515
22.5.1 强制执行HTTPS 515
22.5.2 HTTP严格传输安全协议(HSTS) 515
22.5.3 HTTPS和响应压缩 516
22.5.4 跨域资源共享(CORS) 516
22.5.5 内容安全策略(CSP) 517
22.5.6 跨应用共享Cookie 517
22.6 小结 517
第23章 高级功能 518
23.1 全球化和本地化 518
23.1.1 服务注册和请求管道配置 518
23.1.2 准备本地化文本 519
23.1.3 使用本地化服务 520
23.1.4 准备语言设置界面 522
23.2 GraphQL 523
23.2.1 服务端 523
23.2.2 客户端 562
23.3 Elsa 565
23.3.1 基础概念 565
23.3.2 搭建Web服务器 566
23.3.3 简单自动工作流 568
23.3.4 人机交互工作流 569
23.4 MiniProfiler 572
23.5 小结 573
第24章 其他.NET功能 574
24.1 C/C 互操作 574
24.1.1 CppSharp简介 574
24.1.2 基础使用 575
24.2 程序集的动态载入和卸载 578
24.3 小结 580
第四篇 实战演练
第25章 电子商城项目 583
25.1 项目定位 583
25.2 需求分析 584
25.2.1 统一的身份认证和授权中心 584
25.2.2 买家的独立网页渲染和业务逻辑服务 584
25.2.3 卖家的店铺、商品和订单管理 584
25.3 架构设计 585
25.4 创建解决方案和Git存储库 586
25.4.1 创建解决方案 586
25.4.2 创建Git存储库 587
25.5 定义应用域的通用抽象接口 588
25.5.1 实体相关接口 588
25.5.2 仓储相关接口 591
25.5.3 命令和事件相关接口 596
25.6 开发通用基础设施 601
25.6.1 EF Core仓储 601
25.6.2 MediatR总线 605
25.7 开发身份认证和授权中心 608
25.7.1 EF Core扩展 608
25.7.2 Identity实体和上下文 609
25.7.3 集成Identity到ASP.NET Core托管网站 621
25.7.4 集成第三方账号登录 624
25.7.5 增加角色管理功能 625
25.7.6 添加OpenIddict服务端组件 627
25.8 开发买家商城 633
25.8.1 商城服务实体 633
25.8.2 商城服务 642
25.8.3 商城服务API站点 646
25.8.4 商城网站的初步开发 660
25.8.5 订单服务 671
25.8.6 订单服务API站点 674
25.8.7 商城网站的购物业务 676
25.9 开发卖家管理中心 681
25.9.1 卖家API 681
25.9.2 卖家管理应用 700
25.10 小结 723
第1章 构建.NET 6开发环境 3
1.1 .NET、.NET Core、.NET Standard与.NET Framework 3
1.2 ASP.NET Core与ASP.NET 4
1.3 其他.NET应用模型 4
1.4 Visual Studio简介 4
1.5 安装Visual Studio 5
1.6 小结 7
第2章 Visual Studio的解决方案和项目 8
2.1 解决方案和项目简介 8
2.2 创建解决方案和项目 8
2.2.1 创建方法 8
2.2.2 操作演示和说明 9
2.3 引用其他项目和第三方程序包 12
2.3.1 引用其他项目 12
2.3.2 引用第三方程序包 13
2.3.3 卸载程序包和项目引用 16
2.4 .NET主要项目类型 16
2.5 解决方案和项目文件解析 16
2.5.1 解决方案文件 16
2.5.2 项目文件 17
2.6 小结 18
第3章 C#发展史 19
3.1 简介 19
3.2 C# 1.0 19
3.2.1 类、结构体和联合体 20
3.2.2 接口 22
3.2.3 属性 23
3.2.4 委托 26
3.2.5 事件 28
3.2.6 运算符和表达式 29
3.2.7 语句 31
3.2.8 命名空间 31
3.2.9 特性 32
3.2.10 unsafe上下文 33
3.3 C# 2.0 35
3.3.1 泛型 35
3.3.2 协变和逆变 38
3.3.3 委托的方法组转换 39
3.3.4 分部类型 39
3.3.5 匿名方法 40
3.3.6 可为null的结构体 40
3.3.7 枚举器 41
3.3.8 静态类 41
3.3.9 独立的属性访问器保护级别 43
3.3.10 委托类型推断 43
3.4 C# 3.0 44
3.4.1 自动实现属性 44
3.4.2 分部方法 44
3.4.3 对象初始化器 45
3.4.4 隐式类型的本地变量 45
3.4.5 匿名类型 46
3.4.6 Lambda表达式 46
3.4.7 表达式树 47
3.4.8 扩展方法 47
3.4.9 LINQ(Language-Integrated Query) 48
3.5 C# 4.0 50
3.5.1 动态绑定 50
3.5.2 可选参数和命名参数 50
3.5.3 嵌入的互操作类型 51
3.5.4 泛型的协变和逆变 51
3.6 C# 5.0 52
3.6.1 调用方信息特性 52
3.6.2 异步成员 52
3.7 C# 6.0 53
3.7.1 静态导入 53
3.7.2 异常筛选器 54
3.7.3 表达式体成员 54
3.7.4 自动属性初始化表达式 55
3.7.5 索引初始化器 55
3.7.6 null引用传播运算符 55
3.7.7 字符串内插 56
3.7.8 nameof运算符 57
3.7.9 catch和finally块中的await 57
3.7.10 Roslyn 57
3.8 C# 7.0 60
3.8.1 out变量 60
3.8.2 元组、解构和弃元 60
3.8.3 模式匹配 61
3.8.4 本地函数 62
3.8.5 表达式体成员增强 63
3.8.6 二进制文本和数字分隔符 63
3.8.7 throw表达式 63
3.8.8 ref局部变量和返回值 63
3.9 C# 7.1 64
3.9.1 异步主函数 64
3.9.2 default表达式 64
3.9.3 元组元素名称推断 65
3.9.4 泛型类型参数的模式匹配 65
3.10 C# 7.2 65
3.10.1 非尾随命名参数 65
3.10.2 数值文本的前导下画线 66
3.10.3 private protected访问修饰符 66
3.10.4 针对参数的in修饰符 66
3.10.5 针对方法返回值的ref readonly修饰符 67
3.10.6 readonly struct结构体 67
3.10.7 ref struct结构体 68
3.10.8 条件ref表达式 68
3.11 C# 7.3 68
3.11.1 非托管类型和泛型约束增强 68
3.11.2 无须固定即可访问固定的字段 69
3.11.3 可以重新分配ref局部变量 69
3.11.4 可以使用stackalloc数组上的初始值设定项 69
3.11.5 更多类型支持fixed语句 70
3.11.6 元组支持“==”和“!=”操作符 70
3.11.7 支持为自动实现属性的后台字段添加特性 70
3.11.8 增强包含in修饰符的方法重载的选择策略 70
3.11.9 扩展out变量的适用范围 71
3.11.10 改进方法重载的选择策略 71
3.12 C# 8.0 71
3.12.1 默认接口方法 71
3.12.2 模式匹配增强 72
3.12.3 结构体的readonly成员 75
3.12.4 using声明 75
3.12.5 静态本地函数 76
3.12.6 可释放的ref struct 76
3.12.7 可为null的引用类型 76
3.12.8 异步可释放 77
3.12.9 异步枚举器 78
3.12.10 索引和范围 79
3.12.11 null合并赋值 80
3.12.12 非托管泛型结构体 80
3.12.13 嵌套表达式中的stackalloc 80
3.12.14 内插字符串和逐字字符串 80
3.13 C# 9.0 81
3.13.1 init属性访问器 81
3.13.2 记录 81
3.13.3 顶级程序 83
3.13.4 模式匹配增强 84
3.14 本机大小的整数 85
3.14.1 函数指针 85
3.14.2 禁止本地初始化特性 86
3.14.3 静态匿名函数 87
3.14.4 类型推导的new表达式 87
3.14.5 类型推导的条件表达式 88
3.14.6 协变返回类型 88
3.14.7 foreach循环支持GetEnumerator扩展方法 88
3.14.8 参数弃元 89
3.14.9 本地函数支持特性 89
3.14.10 模块初始化器 90
3.14.11 分部方法增强 90
3.14.12 源生成器 91
3.15 C# 10.0 91
3.15.1 结构体记录 91
3.15.2 结构体允许自定义公共无参构造函数 91
3.15.3 强化的with表达式 92
3.15.4 记录允许密封ToString方法 92
3.15.5 全局using 92
3.15.6 文件范围的命名空间 93
3.15.7 常量内插字符串 93
3.15.8 内插字符串处理程序 93
3.15.9 Lambda表达式增强 93
3.15.10 CallerArgumentExpression诊断特性 94
3.15.11 解构支持混合使用已有变量和内联声明变量 94
3.15.12 增强的属性模式 94
3.15.13 方法上的自定义异步状态机特性 95
3.16 小结 95
第二篇 Entity Framework Core
第4章 快速入门 99
4.1 简介 99
4.2 创建项目和安装EF Core 99
4.3 创建数据模型 99
4.4 创建数据上下文 100
4.5 创建数据库 100
4.6 简单使用 101
4.7 小结 102
第5章 实体模型 103
5.1 实体类型和实体模型配置 103
5.1.1 基本实体类型 104
5.1.2 基础实体模型配置 105
5.1.3 排序规则 108
5.1.4 值生成和计算属性 109
5.1.5 影子属性 112
5.1.6 幕后字段 112
5.1.7 模型字段 113
5.1.8 键 114
5.1.9 索引 117
5.1.10 并发标记与行版本 118
5.1.11 值转换器 119
5.1.12 值比较器和属性快照 121
5.1.13 数据种子 123
5.1.14 构造函数 124
5.1.15 继承 127
5.1.16 无键实体类型 129
5.1.17 实体的多重映射 130
5.1.18 索引器属性、共享类型实体和属性包 131
5.2 全局查询过滤器 132
5.3 自定义实体模型注解 132
5.4 自定义数据库函数和映射 133
5.4.1 标量值函数映射 133
5.4.2 表值函数映射 134
5.4.3 存储过程映射 135
5.5 在一个上下文类型中使用多个模型 136
5.6 小结 137
第6章 实体模型的关系 138
6.1 概念和术语简介 138
6.2 实体模型的关系与影子属性 138
6.3 一对一关系 139
6.3.1 实体类型和关系配置 140
6.3.2 表共享(表拆分) 141
6.3.3 从属实体类型 142
6.4 一对多关系 143
6.4.1 实体类型和关系配置 143
6.4.2 自关联与树形实体类型 145
6.4.3 从属实体类型的集合 145
6.5 多对多关系 146
6.5.1 显式映射 146
6.5.2 隐式映射 148
6.6 模型关系的级联删除 149
6.7 小结 151
第7章 管理实体模型和数据库架构 152
7.1 迁移 152
7.1.1 安装迁移工具 153
7.1.2 管理迁移 154
7.1.3 应用迁移 155
7.1.4 自定义迁移操作 156
7.1.5 使用独立的迁移项目 162
7.1.6 为模型提供多个迁移 163
7.1.7 自定义迁移历史记录 164
7.2 逆向工程 165
7.3 EF Core Power Tools 165
7.4 小结 165
第8章 管理数据 166
8.1 基础保存 166
8.1.1 添加实体 166
8.1.2 更新实体 167
8.1.3 删除实体 168
8.1.4 订阅保存事件和注册保存拦截器 169
8.2 保存相关实体 170
8.2.1 同时添加多个相关实体 170
8.2.2 为主实体单独添加从实体 171
8.2.3 更改实体的关系 172
8.2.4 删除关系 173
8.3 并发冲突 174
8.4 事务 175
8.4.1 简单事务 175
8.4.2 跨上下文事务 176
8.4.3 使用外部事务 177
8.4.4 保存点 178
8.5 异步保存 178
8.6 实体跟踪器和实体追踪图 179
8.6.1 基础使用 179
8.6.2 订阅实体跟踪事件 180
8.7 小结 180
第9章 查询数据 181
9.1 基础查询 181
9.1.1 查询数据集合 181
9.1.2 查询单个数据 182
9.1.3 查询标量值 183
9.1.4 引用影子属性 183
9.1.5 查询标记 184
9.2 复杂查询 184
9.2.1 结果投影 184
9.2.2 连接查询 185
9.2.3 分组查询 187
9.2.4 临时禁用全局查询过滤器 188
9.3 原始SQL查询 188
9.4 映射的自定义函数 189
9.4.1 使用标量值函数 189
9.4.2 使用表值函数和存储过程 189
9.4.3 自定义方法转换 190
9.5 加载相关数据 191
9.5.1 预加载 191
9.5.2 延迟加载 192
9.5.3 显式加载 195
9.5.4 拆分查询 195
9.6 跟踪和非跟踪查询 196
9.7 显式编译查询 197
9.8 查看生成的SQL语句 197
9.9 服务端查询和客户端查询 198
9.10 命令拦截器 198
9.11 异步查询 199
9.12 小结 199
第10章 Entity Framework Core共享功能 200
10.1 配置上下文 200
10.1.1 日志记录 200
10.1.2 参数显示 201
10.1.3 全局默认拆分查询 201
10.1.4 全局默认基于标识解析的非跟踪查询 201
10.2 自动重试 201
10.3 内存数据库 202
10.4 小结 202
第三篇 ASP.NET Core
第11章 快速入门 205
11.1 简介 205
11.2 创建项目 205
11.3 小结 208
第12章 公共基础 209
12.1 依赖注入 209
12.1.1 概述 209
12.1.2 在控制台应用中使用依赖注入 210
12.1.3 在ASP.NET Core应用中使用依赖注入 214
12.1.4 EF Core中的依赖注入 216
12.1.5 面向切面编程 216
12.2 配置 223
12.2.1 简介 223
12.2.2 在控制台应用中使用配置 224
12.2.3 在ASP.NET Core应用中使用配置 224
12.3 选项 226
12.3.1 简介 226
12.3.2 具名选项 226
12.3.3 数据变更同步和变更事件 226
12.3.4 后期处理 226
12.3.5 选项验证 226
12.3.6 选项作用域 227
12.3.7 在控制台应用中使用选项 227
12.3.8 在ASP.NET Core应用中使用选项 232
12.3.9 利用依赖注入的选项 233
12.4 日志 234
12.4.1 日志类别 235
12.4.2 严重性级别 235
12.4.3 事件Id 235
12.4.4 消息模板 236
12.4.5 记录异常 236
12.4.6 作用域 236
12.4.7 运行时更改过滤器级别 236
12.4.8 在简单控制台应用中使用日志 236
12.4.9 记录提供程序 237
12.5 主机 238
12.5.1 托管服务 238
12.5.2 环境 240
12.5.3 通用主机 240
12.6 Web主机 243
12.6.1 托管到Windows服务和Linux服务 243
12.6.2 .NET后台服务 244
12.7 中间件和请求处理管道 245
12.7.1 中间件和请求处理管道的关系 245
12.7.2 终端中间件和管道短路 246
12.7.3 中间件的顺序 247
12.7.4 管道分支 248
12.7.5 内置中间件 249
12.7.6 自定义中间件 251
12.8 Startup类 254
12.8.1 基础使用 254
12.8.2 多环境Startup 255
12.8.3 Startup过滤器 256
12.8.4 .NET 6新增的最小配置API 258
12.9 静态文件 258
12.9.1 基础使用 258
12.9.2 目录浏览 259
12.9.3 静态文件授权 260
12.10 动态响应和静态资源压缩 260
12.10.1 动态响应压缩 260
12.10.2 静态资源压缩 261
12.11 缓存 261
12.11.1 客户端缓存 261
12.11.2 缓存服务和响应缓存中间件 262
12.11.3 页面数据缓存 264
12.12 流量控制 264
12.12.1 请求频率控制 264
12.12.2 响应发送速率控制 264
12.13 端点路由 279
12.13.1 传统路由回顾 279
12.13.2 端点路由简介 279
12.13.3 基础使用 280
12.13.4 链接生成 280
12.13.5 路由模板 281
12.13.6 路由约束 281
12.13.7 自定义约束 282
12.13.8 参数转换器 283
12.13.9 自定义端点 284
12.14 发送HTTP请求 289
12.14.1 基础使用 290
12.14.2 请求中间件 293
12.14.3 基于策略的处理程序和弹性故障处理 295
12.14.4 请求标头传播和分布式链路追踪 297
12.14.5 管理和使用Cookie 298
12.15 错误处理 299
12.16 托管和部署 301
12.17 小结 303
第13章 身份认证 304
13.1 基础身份认证 304
13.1.1 Cookie认证 304
13.1.2 JWT认证 308
13.1.3 自定义身份认证 313
13.1.4 接入第三方身份认证服务 314
13.2 ASP.NET Core Identity 318
13.2.1 基础使用 319
13.2.2 自定义用户数据 321
13.2.3 账户确认和密码重置 322
13.2.4 双因素身份验证和二维码生成 323
13.2.5 隐私数据保护 323
13.3 OpenIddict 329
13.3.1 OpenId Connect(OIDC)和OAuth协议简介 329
13.3.2 OpenIddict简介 332
13.3.3 基础使用 332
13.4 小结 340
第14章 授权 341
14.1 定义授权策略 341
14.2 配置授权策略 343
14.3 高级功能简介 345
14.3.1 授权策略提供程序 345
14.3.2 自定义授权结果的处理方式 345
14.4 小结 345
第15章 MVC 346
15.1 简介 346
15.1.1 MVC模式 346
15.1.2 ASP.NET Core MVC 347
15.2 模型 347
15.2.1 基础使用 347
15.2.2 自定义数据源 350
15.2.3 特殊数据类型 350
15.2.4 从模型绑定中排除特定类型 350
15.2.5 模型绑定的全球化 350
15.2.6 手动调用模型绑定 351
15.2.7 输入格式化器 351
15.2.8 为输入格式化器自定义特定类型的转换器 352
15.2.9 自定义模型绑定 352
15.2.10 模型验证 355
15.3 控制器和动作 359
15.3.1 基础使用 359
15.3.2 控制器和动作中的依赖注入 360
15.3.3 IActionResult 361
15.4 MVC过滤器 362
15.4.1 简介 362
15.4.2 授权过滤器 364
15.4.3 自定义过滤器 364
15.4.4 依赖注入 366
15.4.5 配置过滤器 367
15.5 视图 368
15.5.1 Razor引擎简介 368
15.5.2 基础Razor语法 368
15.5.3 特殊Razor文件 373
15.5.4 标签助手 374
15.5.5 视图组件 378
15.5.6 客户端模型验证 381
15.5.7 运行时视图编译 386
15.5.8 视图编码 386
15.5.9 视图发现 387
15.6 区域 388
15.7 MVC路由 389
15.7.1 传统路由 389
15.7.2 特性路由 390
15.7.3 路由参数转换器 391
15.8 应用程序模型 391
15.9 应用程序部件 392
15.10 小结 393
第16章 Razor Pages 394
16.1 简介 394
16.2 基础使用 395
16.3 页面处理器 396
16.3.1 默认约定 396
16.3.2 相关的Razor指令 397
16.3.3 后台代码 398
16.4 模型绑定 398
16.5 Razor Pages过滤器 399
16.5.1 全局配置 399
16.5.2 重写基类的方法 400
16.5.3 特性配置 400
16.6 Razor Pages路由 400
16.7 小结 401
第17章 Blazor 402
17.1 简介 402
17.2 公共基础 403
17.2.1 依赖注入 403
17.2.2 配置 404
17.2.3 启动 405
17.2.4 环境 407
17.2.5 路由 408
17.2.6 错误处理 408
17.3 Razor组件 410
17.3.1 相关的Razor指令 410
17.3.2 后台代码和分部类支持 411
17.3.3 输出原始HTML 412
17.3.4 依赖注入 412
17.3.5 路由和导航 413
17.3.6 组件参数 414
17.3.7 属性展开和任意参数 414
17.3.8 子内容 415
17.3.9 组件和元素引用 416
17.3.10 使用@key控制是否保留元素和组件 416
17.3.11 Razor模板 417
17.3.12 模板化组件 417
17.3.13 级联值和参数 419
17.3.14 数据绑定 421
17.3.15 事件处理 423
17.3.16 生命周期 425
17.3.17 组件渲染 427
17.3.18 虚拟滚动组件 428
17.3.19 动态组件 429
17.3.20 表单和验证 429
17.3.21 CSS隔离 429
17.3.22 常用内置组件简介 430
17.4 服务端预渲染 431
17.4.1 基础使用 431
17.4.2 保持组件状态 434
17.5 布局 437
17.6 发送HTTP请求 437
17.7 JavaScript互操作 437
17.7.1 从.NET调用JavaScript 438
17.7.2 从JavaScript调用.NET 439
17.8 状态管理 442
17.9 程序集延迟加载 443
17.9.1 基础使用 443
17.9.2 延迟加载的程序集中的可路由组件 444
17.10 渐进式Web应用 445
17.10.1 简介 445
17.10.2 启用PWA支持 445
17.11 调试 447
17.11.1 准备工作 447
17.11.2 启用调试 448
17.11.3 在浏览器中调试 448
17.12 托管和部署 450
17.12.1 常用发布选项 450
17.12.2 关于应用基地址和在同一个服务端同时托管多个应用的注意事项 451
17.12.3 AOT编译、IL裁剪和引用Native代码功能简介 462
17.13 小结 463
第18章 Razor类库 464
18.1 简介 464
18.2 静态资源组织 464
18.3 小结 465
第19章 Web API 466
19.1 基础使用 466
19.1.1 默认约定的API控制器 466
19.1.2 Web API路由 468
19.1.3 模型绑定 468
19.2 API版本、Open API和Swagger 469
19.2.1 多版本API 470
19.2.2 Swashbuckle 471
19.3 小结 473
第20章 远程过程调用 474
20.1 WCF回顾 474
20.2 gRPC 475
20.2.1 PROTO文件 475
20.2.2 服务端 475
20.2.3 客户端 478
20.2.4 在Blazor WebAssembly应用中使用gRPC-Web客户端 480
20.3 小结 481
第21章 实时通信 482
21.1 早期解决方案回顾 482
21.2 WebSocket简介 482
21.3 SignalR 483
21.3.1 集线器 483
21.3.2 流式连接 490
21.3.3 消息格式协议 492
21.3.4 应用承载力扩展 492
21.3.5 客户端 493
21.4 小结 507
第22章 应用安全 508
22.1 数据保护 508
22.1.1 基础使用 508
22.1.2 层次结构 510
22.1.3 时效性数据保护 510
22.2 管理机密 510
22.3 欧盟通用数据保护条例(GDPR) 511
22.4 防御恶意攻击 512
22.4.1 跨站点请求伪造(XSRF/CSRF) 513
22.4.2 开放重定向攻击 514
22.4.3 跨站点脚本攻击(XSS) 514
22.5 一般安全功能 515
22.5.1 强制执行HTTPS 515
22.5.2 HTTP严格传输安全协议(HSTS) 515
22.5.3 HTTPS和响应压缩 516
22.5.4 跨域资源共享(CORS) 516
22.5.5 内容安全策略(CSP) 517
22.5.6 跨应用共享Cookie 517
22.6 小结 517
第23章 高级功能 518
23.1 全球化和本地化 518
23.1.1 服务注册和请求管道配置 518
23.1.2 准备本地化文本 519
23.1.3 使用本地化服务 520
23.1.4 准备语言设置界面 522
23.2 GraphQL 523
23.2.1 服务端 523
23.2.2 客户端 562
23.3 Elsa 565
23.3.1 基础概念 565
23.3.2 搭建Web服务器 566
23.3.3 简单自动工作流 568
23.3.4 人机交互工作流 569
23.4 MiniProfiler 572
23.5 小结 573
第24章 其他.NET功能 574
24.1 C/C 互操作 574
24.1.1 CppSharp简介 574
24.1.2 基础使用 575
24.2 程序集的动态载入和卸载 578
24.3 小结 580
第四篇 实战演练
第25章 电子商城项目 583
25.1 项目定位 583
25.2 需求分析 584
25.2.1 统一的身份认证和授权中心 584
25.2.2 买家的独立网页渲染和业务逻辑服务 584
25.2.3 卖家的店铺、商品和订单管理 584
25.3 架构设计 585
25.4 创建解决方案和Git存储库 586
25.4.1 创建解决方案 586
25.4.2 创建Git存储库 587
25.5 定义应用域的通用抽象接口 588
25.5.1 实体相关接口 588
25.5.2 仓储相关接口 591
25.5.3 命令和事件相关接口 596
25.6 开发通用基础设施 601
25.6.1 EF Core仓储 601
25.6.2 MediatR总线 605
25.7 开发身份认证和授权中心 608
25.7.1 EF Core扩展 608
25.7.2 Identity实体和上下文 609
25.7.3 集成Identity到ASP.NET Core托管网站 621
25.7.4 集成第三方账号登录 624
25.7.5 增加角色管理功能 625
25.7.6 添加OpenIddict服务端组件 627
25.8 开发买家商城 633
25.8.1 商城服务实体 633
25.8.2 商城服务 642
25.8.3 商城服务API站点 646
25.8.4 商城网站的初步开发 660
25.8.5 订单服务 671
25.8.6 订单服务API站点 674
25.8.7 商城网站的购物业务 676
25.9 开发卖家管理中心 681
25.9.1 卖家API 681
25.9.2 卖家管理应用 700
25.10 小结 723
猜您喜欢