.NET Core 开发实战
肖伟宇
校宝在线架构师、SkyWalking .NET 探针贡献者、NetCorePal 组件库创建者
20086 人已学习
新⼈⾸单¥59
课程目录
已完结/共 61 讲
第一章:必备知识 (25讲)
时长 06:28
时长 02:13
.NET Core 开发实战
登录|注册
留言
31
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 06 | 作用域与对象释放行为:你知道IDisposable对象释放的时机和坑吗?
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | .NET Core的现状、未来以及环境搭建
04 | Startup:掌握ASP.NET Core的启动过程
05 | 依赖注入:良好架构的起点
06 | 作用域与对象释放行为:你知道IDisposable对象释放的时机和坑吗?
07 | 用Autofac增强容器能力:引入面向切面编程(AOP)的能力
08 | 配置框架:让服务无缝适应各种环境
09 | 命令行配置提供程序:最简单快捷的配置注入方法
10 | 环境变量配置提供程序:容器环境下配置注入的最佳途径
11 | 文件配置提供程序:自由选择配置的格式
12 | 配置变更监听:配置热更新能力的核心
13 | 配置绑定:使用强类型对象承载配置数据
14 | 自定义配置数据源:低成本实现定制化配置方案
15 | 选项框架:服务组件集成配置的最佳实践
16 | 选项数据热更新:让服务感知配置的变化
17 | 为选项数据添加验证:避免错误配置的应用接收用户流量
18 | 日志框架:聊聊记日志的最佳姿势
19 | 日志作用域:解决不同请求之间的日志干扰
20 | 结构化日志组件Serilog:记录对查询分析友好的日志
21 | 中间件:掌控请求处理过程的关键
22 | 异常处理中间件:区分真异常与逻辑异常
23 | 静态文件中间件:前后端分离开发合并部署骚操作
24 | 文件提供程序:让你可以将文件放在任何地方
25 | 路由与终结点:如何规划好你的Web API
26 | 工程结构概览:定义应用分层及依赖关系
27 | 定义Entity:区分领域模型的内在逻辑和外在行为
28 | 工作单元模式(UnitOfWork):管理好你的事务
29 | 定义仓储:使用EF Core实现仓储层
30 | 领域事件:提升业务内聚,实现模块解耦
31 | APIController:定义API的最佳实践
32 | 集成事件:解决跨微服务的最终一致性
33 | 集成事件:使用RabbitMQ来实现EventBus
34 | MediatR:轻松实现命令查询职责分离模式(CQRS)
35 | MediatR:让领域事件处理更加优雅
36 | HttpClientFactory:管理向外请求的最佳实践
37 | gRPC:内部服务间通讯利器
38 | gRPC:用代码生成工具提高生产效率
39 | Polly:用失败重试机制提升服务可用性
40 | Polly:熔断慢请求避免雪崩效应
41 | 网关与BFF:区分场景与职责
42 | 网关与BFF:使用JWT来实现身份认证与授权
43 | 安全:反跨站请求伪造
44 | 安全:防开放重定向攻击
45 | 安全:防跨站脚本
46 | 安全:跨域请求
47 | 缓存:为不同的场景设计合适的缓存策略
48 | 部署:演示一个部署流程
49 | ConfigMap:实现基本配置方案
50 | 配置:使用分布式配置中心方案版本化管理配置
51 | 健康检查:与Liveness、Readiness、Startup探测集成实现高可用
52 | 健康检查:搭建全量健康检查探针和看板
53 | ForwardedHeaders:确保服务在负载均衡下正常工作
54 | 安全:介绍强制HTTPS的两种方式
55 | 日志:与EFK日志三件套集成
56 | 日志:Exceptionless日志系统
57 | 追踪:集成SkyWalking .NET实现追踪
58 | 监控与告警:Prometheus与AlertManager
59 | 监控与告警:用Granfana实现监控看板
60 | prometheus-net:自定义监控指标利器
61 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(31)

  • 最新
  • 精选
大风
能在解释下第五分钟谈到的,当前应用容器,当前请求容器?

作者回复: RequestService是指ASP.NET Core框架为每个HTTP请求创建的子容器,就是当前请求的容器。

2020-02-13
2
8
季某人
老师您好,请问一下如果服务不实现IDisposable接口,那么这个服务是由GC负责释放的吗

作者回复: 是的

2020-01-21
6
Mr.Beethoven
老师,什么时候会用到“从根容器获取瞬时服务”这件事 是不是不应该从根容器获取瞬时服务

作者回复: 对于实现了IDisposable的服务,要避免在跟容器以瞬时服务的方式获取 对于没有实现IDisposable的服务,是没有关系的

2020-01-14
2
4
哇哈哈啊哈哈
感谢老肖的视频讲解,之前一直在看官方文档,理解的内容都是一片一片的,很容易忘记,今天看了老肖的视频,整理了一些笔记,贴出来有不对的地方,希望老肖能指正下。 1.应用启动时IServiceCollection会创建根容器IServiceprovider。我们自定义的服务都会在configservices方法中注册(问题一:此时自定义的服务是声明在根容器中吗?),注册时所用的生命周期也是服务在根容器中的生命周期。 2.不考虑自己创建的服务并继承了释放接口的情况下。瞬时服务会在每次请求后释放,范围服务如果是定义在根容器中,则和单例服务一样,应用退出后被释放。如果范围服务定义在子容器中,则由子容器控制释放。 3.除了使用requestService这个应用程序为每个请求创建的子容器,还有别的方法自己创建子容器吗?(这个问题我可以自己百度),但还是想问下,因为现在在蹲坑整理笔记中......

作者回复: 大体的理解是对的,更准确一点: 1.IServiceCollection表示我们定义的服务类型、构造方式和生命周期的配置表,IServiceprovider则表示跟容器,当我们调用GetService时,它会根据IServiceCollection中的定义来决定如何构造(或者返回一个已有的)服务对象。 2.容器只会管理实现了IDisposable的服务的释放(调用Dispose方法),对于未实现IDisposable的服务,容器是不管的。 另外对象最终的回收,是由GC完成的。 生命周期的定义,是决定了容器是返回一个新对象,还是复用之前创建的对象。 3.使用IServiceprovider的扩展方法CreateScope来创建子容器。

2020-03-29
3
黄青松
老师,什么是根容器,什么是子容器

作者回复: 根容器可以理解为由我们通过ServiceCollection Build出的容器,子容器是由容器创建出来的,其中父容器也可以是其他容器的子容器,也就是孩子的孩子,这个关系是可以一直嵌套下去的

2020-01-14
3
爱学习的大叔
听了几节课,老师讲的非常棒,把依赖注入、如何使用作用域以及一些坑讲的挺好的。听完以后就知道怎么举一反三写代码。比我在其他地方看些.net core的教程好多了。

作者回复: 感谢支持

2020-03-23
2
SuperSnow
避免在根容器获取实现了IDisposable接口的瞬时服务,是不是也要再加上作用域服务?因为一个请求同样也会创建服务。

作者回复: 在跟容器获取作用域服务会直接报错

2020-03-09
2
2
再见理想
最后的根容器瞬时服务为什么 请求了多次 只释放了一次 不应该是每次创建都会有一个新的吗

作者回复: 是因为请求的代码里并没有创建瞬时服务,仅仅在启动过程中使用根容器创建了瞬时服务

2020-01-15
2
2
张志炜
老师说的根容器,是说Startup.Configure里面么。 这里面,好像只有站点第一次运行的时候才会执行到。 后续每次Get都和这里无关。 所以,就算是瞬时服务,在这里被获取了,最多是和单例一样,获取一次,不会每次Get都重新获取而不释放吧。

作者回复: 启动过程是一次性的,启动后,每次请求都会由”一个“线程作处理请求。 你的理解是对的,在请求的处理中不要使用根容器,应该使用scope的容器,否则一样会有问题。

2020-05-16
1
张志炜
注册一个瞬时服务。 然后在根容器中,去获取这个服务。 你获取了一次,就只会获取一个服务。 应该也不会有太严重的问题? 因为我一开始看你介绍,还以为是每次Action的时候都会创建,那么内存持续占用而不释放。 但如果根容器中调用了一次之后,不会再次调用,那么和单例对象没有什么区别,应该不是大问题?

作者回复: 感谢建议,你的理解是对的。 这里核心是不要在请求的代码中使用根容器,要使用requestservice 这种scope容器,否则会有问题

2020-05-16
2
1
收起评论