本书讲解.NET平台下的异步编程、LINQ、依赖注入、配置系统、日志等相关技术的原理与应用;深入且全面地介绍Entity Framework Core在项目中的应用场景,剖析Entity Framework Core的实现原理。本书在讲解使用ASP.NET Core进行Web API开发的同时,结合作者的实践经验介绍REST、前后端分离等编程理念在ASP.NET Core中的实现。此外,本书还会介绍领域驱动设计(DDD)的理念,并且通过来自项目开发一线的案例讲解DDD理念在项目中的技术落地方案。最后,本书通过真实的英语学习网站的项目案例讲解ASP.NET Core技术在项目中的应用。总体而言,本书不仅介绍技术的使用,而且讲解技术的底层原理;不仅介绍作者在项目开发一线的实践经验,而且讲解综合项目案例的具体实现。
本书可供具有一定编程基础的开发人员学习ASP.NET Core的使用方法,也可供具有一定经验的.NET开发人员了解.NET的内部原理和学习相关项目实战经验,还可作为大中专院校学生的ASP.NET Core教材。
作者说:写一本关于.NET Core的书并不难,但是写一本关于.NET Core的好书太难了!如果只是为了写一本讲解.NET Core的书,我只要照着微软的官方文档去改编一下就行了,但是这样编出来的书有什么价值呢?微软的.NET文档所讲的内容已经非常丰富了,我没必要再去把它们重复一遍。我需要讲解微软文档中没有讲到的内容,读者也需要这样一本书:
> 讲解相关技术背后的原理;
> 讲解相关技术应用在哪些场景中;
> 讲解相关技术有哪些优缺点;
> 讲解相关技术在项目中如何应用;
> 讲解真实项目的架构和技术实现。
为了达成上述目标,我在编写本书的时候做了大量的底层源代码的研究工作。比如,在讲解“异步编程”的时候,我翻阅了.NET中异步编程的源代码,从而帮助读者更好地理解和应用异步编程;又如,在讲解“表达式树”的时候,我翻阅了EF Core的表达式树翻译引擎,并且编写了一个关于翻译引擎的开源项目,以帮助读者理解“表达式树”的底层原理。
项目中很多技术的讲解需要基于具有一定深度的实践应用案例,这样才能避免技术的讲解流于表面,因此我在本书中编入了很多具有深度的案例。比如,在讲解依赖注入的时候,我通过开发一个自己的配置系统、日志系统讲解依赖注入是如何把系统组件装配在一起的;又如,在讲解ASP.NET Core中间件的时候,我编写了一个模仿ASP.NET Core Web API的框架,为读者讲解中间件的实际应用。
特别说明:
□ 关于配套资源
鉴于篇幅受限,作者不能把本书每个案例的每一行代码都写到书中,即书中的代码都是关键代码。如果读者想要本书配套的全部代码,则可通过人邮教育社区(www.ryjiaoyu.com)中的本书所在页面进行获取。
□ 关于视频教程
本书还赠送读者配套视频教程。在视频教程中,作者从与图书不同的角度对技术进行诠释。读者结合视频教程学习本书,效果会更好。读者可以通过哔哩哔哩搜索“杨中科”以观看相关视频教程,也可通过人邮教育社区下载相关视频教程。
□ 遇到问题怎么办
读者可以添加作者微信“yzk10240124”以与作者进行交流,同时可以将您针对本书的修改建议与意见反馈给作者。同时,关于本书的勘误与答疑,以及新版功能免费博客等内容,读者也可以通过读者微信进行了解。祝您学习愉快!
杨中科:
.NET方向微软MVP,拥有约30万粉丝以及近18年的IT行业软件开发工作经验,擅长软件架构设计与底层框架研究,具有应用.NET、Java、Python、C等的丰富经验,编写的技术文章和录制的视频教程深入浅出、通俗易懂、备受好评;同时,出版了多部优秀的软件开发技术图书。
【章名目录】
第 1章 .NET Core入门 1
第 2章 .NET Core重难点知识 14
第3章 .NET Core核心基础组件 53
第4章 Entity Framework Core基础 75
第5章 EF Core高级技术 116
第6章 ASP.NET Core Web API基础 155
第7章 ASP.NET Core基础组件 183
第8章 ASP.NET Core高级组件 243
第9章 DDD实战 298
第 10章 项目案例:英语学习网站 359
【详细目录】
第 1章 .NET Core入门 1
1.1 .NET Core概述 1
1.1.1 .NET平台的昨天 1
1.1.2 为什么要跨平台 2
1.1.3 .NET Core 是.NET Framework的升级版吗 2
1.1.4 .NET Framework中哪些技术不被支持 4
1.1.5 .NET Standard是什么 6
1.1.6 项目应该使用.NET Core开发吗 10
1.2 .NET Core 开发环境的搭建 10
1.2.1 用什么开发工具开发.NET Core 11
1.2.2 .NET Core项目结构的创新 11
1.3 本章小结 13
第 2章 .NET Core重难点知识 14
2.1 C#的新语法 14
2.1.1 顶级语句 14
2.1.2 全局using指令 15
2.1.3 using声明 16
2.1.4 文件范围的命名空间声明 17
2.1.5 可为空的引用类型 18
2.1.6 记录类型 20
2.2 异步编程 23
2.2.1 为什么要用异步编程 24
2.2.2 轻松上手await、async 25
2.2.3 如何编写异步方法 27
2.2.4 async、await原理揭秘 28
2.2.5 async背后的线程切换 33
2.2.6 异步方法不等于多线程 34
2.2.7 为什么有的异步方法没有async 36
2.2.8 异步编程的几个重要问题 39
2.3 LINQ 40
2.3.1 Lambda表达式 41
2.3.2 常用集合类的扩展方法 43
2.3.3 LINQ的另一种写法 51
2.4 本章小结 52
第3章 .NET Core核心基础组件 53
3.1 依赖注入 53
3.1.1 什么是控制反转、服务定位器和依赖注入 53
3.1.2 .NET Core依赖注入的基本使用 55
3.1.3 依赖注入魅力所在 57
3.2 配置系统 60
3.2.1 配置系统的基本使用 60
3.2.2 使用选项方式读取配置 61
3.2.3 从命令行读取配置 65
3.2.4 从环境变量读取配置 66
3.2.5 其他配置提供程序 66
3.2.6 案例:开发自己的配置提供程序 67
3.2.7 多配置源问题 69
3.3 日志 70
3.3.1 .NET Core日志基本使用 71
3.3.2 文件日志提供程序NLog 72
3.3.3 集中式日志 73
3.4 本章小结 74
第4章 Entity Framework Core基础 75
4.1 EF Core概述 75
4.1.1 什么是ORM 75
4.1.2 EF Core性能怎么样 76
4.2 EF Core入门 76
4.2.1 该选择什么数据库 76
4.2.2 EF Core环境搭建 77
4.2.3 插入数据 81
4.2.4 查询数据 82
4.2.5 修改和删除数据 83
4.3 EF Core的实体类配置 84
4.3.1 约定大于配置 84
4.3.2 Data Annotation 85
4.3.3 Fluent API 85
4.3.4 Fluent API基本配置 86
4.3.5 Fluent API究竟流畅在哪里 88
4.3.6 主键类型的选择并不简单 89
4.4 数据库迁移 92
4.4.1 数据库迁移原理 92
4.4.2 其他数据库迁移命令 95
4.4.3 反向工程(慎用) 95
4.5 查看EF Core生成的SQL语句 96
4.5.1 使用简单日志查看SQL语句 96
4.5.2 探秘EF Core生成SQL语句的不同 97
4.6 关系配置 100
4.6.1 一对多 100
4.6.2 关联数据的获取 103
4.6.3 实体类对象的关联追踪 104
4.6.4 关系的外键属性的设置 105
4.6.5 单向导航属性 106
4.6.6 关系配置在哪个实体类中 108
4.6.7 一对一 109
4.6.8 多对多 111
4.6.9 基于关系的复杂查询 114
4.7 本章小结 115
第5章 EF Core高级技术 116
5.1 EF Core原理揭秘 116
5.1.1 EF Core有哪些做不到的事情 116
5.1.2 既生IEnumerable,何生IQueryable 117
5.1.3 IQueryable的延迟执行 119
5.1.4 IQueryable的复用 122
5.1.5 EF Core分页查询 122
5.1.6 IQueryable的底层运行 124
5.1.7 EF Core中的异步方法 126
5.1.8 如何执行原生SQL语句 127
5.1.9 怎么知道实体类变化了 129
5.2 EF Core的性能优化利器 131
5.2.1 EF Core优化之AsNoTracking 131
5.2.2 实体类状态跟踪的妙用 132
5.2.3 Find和FindAsync方法 134
5.2.4 EF Core中高效地删除、更新数据 134
5.2.5 全局查询筛选器 135
5.2.6 悲观并发控制 136
5.2.7 乐观并发控制 138
5.3 表达式树 142
5.3.1 什么是表达式树 142
5.3.2 Expression和Func的区别 142
5.3.3 可视化查看表达式树 143
5.3.4 通过代码查看表达式树 145
5.3.5 通过代码动态构建表达式树 146
5.3.6 让动态构建表达式树更简单 148
5.3.7 让构建“动态”起来 149
5.3.8 不用Emit实现Select的动态化 152
5.3.9 避免动态构建表达式树 153
5.4 本章小结 154
第6章 ASP.NET Core Web API基础 155
6.1 ASP.NET Core MVC项目 155
6.1.1 ASP.NET Core MVC项目的搭建 155
6.1.2 编写第 一个MVC程序 157
6.1.3 .NET Core的新工具:热重载 158
6.2 使用ASP.NET Core开发Web API 159
6.2.1 Web API项目的搭建 159
6.2.2 Post、Put等操作方法 161
6.3 Restful:想说爱你不容易 163
6.3.1 什么是Restful 163
6.3.2 Restful的优缺点 165
6.3.3 Restful中如何传递参数 167
6.3.4 返回错误码:200派与4xx派的“对决” 167
6.3.5 Restful实现指南 170
6.4 ASP.NET Core Web API各种技术及选择 171
6.4.1 控制器父类用哪个 171
6.4.2 操作方法的异步、返回值、状态码 171
6.4.3 操作方法的参数从哪里来 173
6.5 ASP.NET Core Web API案例 176
6.5.1 开发Web API 176
6.5.2 什么是前后端分离 177
6.5.3 搭建前端开发环境 178
6.5.4 如何实现前后端分离开发 179
6.6 本章小结 182
第7章 ASP.NET Core基础组件 183
7.1 ASP.NET Core中的依赖注入 183
7.1.1 对象注入的代码写到哪里 183
7.1.2 低使用频率服务的另类注入方式 185
7.1.3 案例:开发模块化的服务注册框架 185
7.2 配置系统与ASP.NET Core的集成 188
7.2.1 默认添加的配置提供者 188
7.2.2 ASP.NET Core的多环境设置 188
7.2.3 用“用户机密”来避免机密信息的泄露 190
7.2.4 案例:配置系统综合 191
7.3 EF Core与ASP.NET Core的集成 193
7.3.1 分层项目中EF Core的用法 193
7.3.2 使用“上下文池”时要谨慎 197
7.3.3 案例:批量注册上下文 197
7.4 性能优化“万金油”:缓存 198
7.4.1 什么是缓存 198
7.4.2 客户端响应缓存 200
7.4.3 服务器端响应缓存 202
7.4.4 内存缓存 204
7.4.5 缓存穿透问题的规避 211
7.4.6 缓存雪崩问题的规避 212
7.4.7 缓存数据混乱的规避 213
7.4.8 案例:封装内存缓存操作的帮助类 213
7.4.9 分布式缓存 215
7.4.10 案例:封装分布式缓存操作 的帮助类 219
7.4.11 缓存方式的选择 221
7.5 筛选器 221
7.5.1 异常筛选器 222
7.5.2 操作筛选器基础 224
7.5.3 案例:自动启用事务的操作筛选器 226
7.5.4 案例:开发请求限流器 228
7.6 中间件 229
7.6.1 什么是中间件 229
7.6.2 中间件的3个概念 230
7.6.3 简单演示中间件 231
7.6.4 案例:自己动手模仿Web API框架 235
7.6.5 调整内置中间件的顺序,结果大不同 237
7.6.6 案例:Markdown转换器中间件 238
7.6.7 筛选器与中间件的区别 241
7.7 本章小结 242
第8章 ASP.NET Core高级组件 243
8.1 Authentication与Authorization 243
8.1.1 标识框架 244
8.1.2 实现密码的重置 250
8.1.3 代替Session(会话)的JWT 251
8.1.4 JWT的基本使用 253
8.1.5 ASP.NET Core对于JWT的封装 257
8.1.6 [Authorize]的注意事项 259
8.1.7 让Swagger中调试带验证的请求更简单 260
8.1.8 解决JWT无法提前撤回的难题 261
8.1.9 总结 265
8.2 利用托管服务执行后台代码 265
8.2.1 托管服务的基本使用 265
8.2.2 托管服务中使用依赖注入的陷阱 267
8.2.3 案例:数据的定时导出 267
8.3 请求数据的校验 269
8.3.1 .NET Core内置数据校验的不足 269
8.3.2 FluentValidation的基本使用 270
8.3.3 FluentValidation中注入服务 271
8.4 SignalR服务器端消息推送 272
8.4.1 SignalR基本使用 273
8.4.2 协议协商 276
8.4.3 SignalR分布式部署 279
8.4.4 SignalR身份认证 280
8.4.5 针对部分客户端的消息推送 283
8.4.6 在外部向集线器推送消息 286
8.4.7 案例:导入英汉词典到数据库并显示进度 288
8.4.8 SignalR实践指南 291
8.5 ASP.NET Core系统的部署 291
8.5.1 ASP.NET Core网站的发布 292
8.5.2 网站部署需要注意的几个问题 293
8.5.3 如何构建一个安全的系统 296
8.6 本章小结 297
第9章 DDD实战 298
9.1 架构设计的术与道 298
9.1.1 架构设计之怪现状 298
9.1.2 架构是进化而来的 299
9.2 DDD的基本概念 300
9.2.1 什么是微服务 300
9.2.2 微服务架构的误区 301
9.2.3 DDD为什么难学 302
9.2.4 领域与领域模型 304
9.2.5 通用语言与界限上下文 305
9.2.6 实体类与值对象 306
9.2.7 聚合与聚合根 307
9.2.8 领域服务与应用服务 308
9.2.9 领域事件与集成事件 308
9.3 DDD的技术落地 311
9.3.1 贫血模型与充血模型 311
9.3.2 EF Core对实体类属性操作的秘密 315
9.3.3 EF Core中实现充血模型 317
9.3.4 EF Core中实现值对象 321
9.3.5 案例:构建表达式树,简化值对象的比较 325
9.3.6 千万不要面向数据库建模 326
9.3.7 聚合在.NET中的实现 326
9.3.8 用MediatR实现领域事件 327
9.3.9 EF Core中发布领域事件的合适时机 329
9.3.10 RabbitMQ的基本使用 335
9.3.11 案例:简化集成事件的框架 338
9.3.12 案例:Zack.EventBus源代码 讲解 342
9.3.13 整洁架构(洋葱架构) 343
9.4 DDD案例实战:用户管理及登录 344
9.4.1 实现整洁架构项目分层 344
9.4.2 领域模型的实现 346
9.4.3 领域服务的实现 349
9.4.4 基础设施的实现 352
9.4.5 工作单元的实现 354
9.4.6 应用服务层的实现 356
9.5 本章小结 358
第 10章 项目案例:英语学习网站 359
10.1 需求说明及项目演示 359
10.1.1 网站需求说明 359
10.1.2 网站结构说明 360
10.1.3 项目结构说明 361
10.1.4 项目运行环境搭建 362
10.1.5 主要功能演示 364
10.2 文件服务的开发 367
10.2.1 开发文件服务的领域层 367
10.2.2 开发文件服务的基础 设施层 369
10.3 认证服务的开发 371
10.3.1 开发认证服务的领域层 371
10.3.2 开发认证服务的基础 设施层 373
10.3.3 开发认证服务的应用服务层 373
10.4 英语听力服务的开发 375
10.4.1 开发英语听力服务的领域层 375
10.4.2 开发英语听力服务的后台 应用服务层 381
10.4.3 开发英语听力服务的前台 应用服务层 385
10.5 转码服务的开发 387
10.5.1 开发转码服务的领域层 387
10.5.2 开发转码服务的基础设施层 389
10.5.3 开发转码服务的应用服务层 390
10.6 搜索服务的实现 392
10.7 性能优化的原则 394
10.8 项目总结 395
10.9 本章小结 396