.NetCore中三种注入生命周期的思考
.NetCore彻底诠释了“万物皆可注入”这句话的含义,在.NetCore中到处可见注入的使用。因此core中也提供了三种注入方式的生命周期使用,分别是:
AddTransient:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例
AddScoped:每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例
AddSingleton:每次都获取同一个实例
当大家已经过了百度每种注入方式的使用场景后,有没有萌生出一个新的问题:就是一个作用域(Scoped)服务中注入一个瞬时(Transient)服务时,瞬时服务中的值还会每次都变化吗?。
出现这个问题是因为:我有两个服务,一个是数据处理服务A(Scoped),一个是从Redis取数据的服务B(Transient),本来想的是处理数据时每次从Redis中新开实例来取数据,但是事与愿违每次Redis实例总是不变,然后自己下载了官方的示例程序研究了一下,在此做个记录,以下为了好区分,我就以主次服务来区分,一共分为几下几种情况:
由图可知,在这种情况下瞬时服务是没用的,两次的结果是一样的。原因是因为scoped服务只有第一次运行的时候是走构造函数的,后面再创建都是直接赋值,而不是创建新对象不走构造函数因此值也不会改变。
这种情况直接报错(Cannot Consume Scoped Service From Singleton),这是因为Core防止我们陷入这样的一个陷阱,怕我们误以为每次请求都会创建一个新的实例
发现结果也是一样的,而且并没有向上面一样报错,难道微软粑粑就不怕我们陷入这样的一个陷阱吗?我个人觉得原因是这样的:Scoped方式是每个请求时创建一个新的实例,但Transient是每个请求中调用每个服务都会创建一个新的实例,在一次请求中,如果在Singleton中还使用Scoped的话,Scoped和Singleton的意义是一样的(比如我这次请求的时候正常Scoped产生的值是1,我在其它服务中使用的值都将是1,但是在Singleton中保存的值还是0,这样就会产生歧义),但如果Singleton中使用Transient的话只针对当前服务中是唯一的,调用其它服务的时候Transient还是会创建新的实例,因此在其它服务中就不会有其它问题(简单来讲就是默认我在Singleton中调用Transient时我就默认产生的值就为0,反正我每次请求都会产生新的值,无所谓是0还是1,还是2了),虽然没有报错但我们还是要避免这样使用。
原文地址:https://www.cnblogs.com/ShaoJianan/p/11136200.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
.NetCore中三种注入生命周期的思考相关推荐
- .NetCore中三种注入方式的思考
.NetCore中三种注入方式的思考 原文:.NetCore中三种注入方式的思考 该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这 ...
- 戏说三种项目生命周期
三种项目生命周期对比: 一.预测性 预测型生命周期,即大家平日里说到瀑布模型.适用于在早期能够确定范围.时间和成本的项目.通过整体计划,按部就班的实施以及最终的验收来进行项目. 比如一个厨师负责一个婚 ...
- 详解.NET Core 依赖注入生命周期
前言 .NET Core 自带依赖注入框架,支持三种不同生命周期的注入模式: Singleton 单例模式 Scoped 区域模式 Transient 瞬时模式 但是常常不知道什么时候使用哪种模式才 ...
- 5种项目生命周期模型(个人笔记)
1.项目生命周期定义参考网站:http://wiki.mbalib.com/wiki/%E9%A1%B9%E7%9B%AE%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F 2. ...
- Kubernetes 中数据包的生命周期 -- 第 3 部分
本文翻译自:Life of a Packet in Kubernetes - Part 3 [1] 作者:Dinesh Kumar Ramasamy 本文在原文的基础上做了适当的修改,如有疑问请查阅原 ...
- 在java中三种编程思想(OOA,OOD,OOP)
在java中三种编程思想:OOA,OOD,OOP OOA 一.OOA的主要原则. 二.面向对象分析产生三种分析模型 三.OOA的主要优点 四.OOA方法的基本步骤 OOD 一.OOD背景知识 二.OO ...
- asp.net application,session,static 几种变量生命周期及用法 收藏
asp.net application,session,static 几种变量生命周期及用法 收藏 Application 是应用程序级变量,如果用到多个用户之间的通信的时候用,多用在网站计算器等,存 ...
- spring三种注入方式
设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...
- spring入门之Spring 常用的三种注入方式
Spring 常用的三种注入方式 Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set 方法注入,基于注解的注入. 一.通过构造方法注入 先简单 ...
最新文章
- 10个堪称神器的学习网站
- Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
- 双显卡能双屏显示吗_i5-8305G+双显卡交火,最近很火的迷你主机零刻Turbo性能靠谱吗?...
- 全球及中国医用腋拐行业竞争格局及供需前景预测报告2021年版
- HBase get查询命令及VERSIONS版本
- PAT ---- 1029. 旧键盘(20)
- 【线上分享】RTC在传统流媒体行业的应用实践
- mvc 模式和mtc 模式的区别
- 也许,这样理解HTTPS更容易
- 【Java IO知识】读取中文乱码问题解决
- 创建Socket【Socket编程4】
- python dataframe 列赋值_dataframe根据新列特征的条件为其赋值,给
- 【Day08】请简述虚拟 DOM 中 Key 的作用和好处
- libuv 原理_Nodejs的运行原理-libuv篇
- 基于 YOLOV3 和 OpenCV的目标检测
- Web前端知识体系梳理,值得收藏!
- 为什么中国没有类似于windows的操作系统?
- python3连接redis
- 单片机蓝牙模块与手机蓝牙通信(3)
- android x86 精简版,逆天!Windows7终极纯净版x86,仅239MB | 殁漂遥
热门文章
- 个人电脑的楷模:新款IMac G5
- 哪个app最费电_微波炉和烤箱,买哪个划算?
- mailing list的原理
- 12c分页查询特性FETCH FIRST ROWS,OFFSET ROWS FETCH NEXT ROW LIMIT Clause子句
- WPF/MVVM 快速开发
- 参赛方案-主机托管、中小企业虚拟化应用
- 什么是Session?
- 技术分享 | 微服务模式下如何高效进行API测试
- .NET 6新特性试用 | record struct
- .NET 6 Talk Party 2|.NET Core 与行业