.NetCore彻底诠释了“万物皆可注入”这句话的含义,在.NetCore中到处可见注入的使用。因此core中也提供了三种注入方式的生命周期使用,分别是:

  1. AddTransient:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例

  1. AddScoped:每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例

  1. 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中三种注入生命周期的思考相关推荐

  1. .NetCore中三种注入方式的思考

    .NetCore中三种注入方式的思考 原文:.NetCore中三种注入方式的思考 该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这 ...

  2. 戏说三种项目生命周期

    三种项目生命周期对比: 一.预测性 预测型生命周期,即大家平日里说到瀑布模型.适用于在早期能够确定范围.时间和成本的项目.通过整体计划,按部就班的实施以及最终的验收来进行项目. 比如一个厨师负责一个婚 ...

  3. 详解.NET Core 依赖注入生命周期

    前言 .NET Core 自带依赖注入框架,支持三种不同生命周期的注入模式: Singleton 单例模式 Scoped 区域模式 Transient  瞬时模式 但是常常不知道什么时候使用哪种模式才 ...

  4. 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. ...

  5. Kubernetes 中数据包的生命周期 -- 第 3 部分

    本文翻译自:Life of a Packet in Kubernetes - Part 3 [1] 作者:Dinesh Kumar Ramasamy 本文在原文的基础上做了适当的修改,如有疑问请查阅原 ...

  6. 在java中三种编程思想(OOA,OOD,OOP)

    在java中三种编程思想:OOA,OOD,OOP OOA 一.OOA的主要原则. 二.面向对象分析产生三种分析模型 三.OOA的主要优点 四.OOA方法的基本步骤 OOD 一.OOD背景知识 二.OO ...

  7. asp.net application,session,static 几种变量生命周期及用法 收藏

    asp.net application,session,static 几种变量生命周期及用法 收藏 Application 是应用程序级变量,如果用到多个用户之间的通信的时候用,多用在网站计算器等,存 ...

  8. spring三种注入方式

    设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...

  9. spring入门之Spring 常用的三种注入方式

    Spring 常用的三种注入方式 Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set 方法注入,基于注解的注入. 一.通过构造方法注入 先简单 ...

最新文章

  1. 10个堪称神器的学习网站
  2. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
  3. 双显卡能双屏显示吗_i5-8305G+双显卡交火,最近很火的迷你主机零刻Turbo性能靠谱吗?...
  4. 全球及中国医用腋拐行业竞争格局及供需前景预测报告2021年版
  5. HBase get查询命令及VERSIONS版本
  6. PAT ---- 1029. 旧键盘(20)
  7. 【线上分享】RTC在传统流媒体行业的应用实践
  8. mvc 模式和mtc 模式的区别
  9. 也许,这样理解HTTPS更容易
  10. 【Java IO知识】读取中文乱码问题解决
  11. 创建Socket【Socket编程4】
  12. python dataframe 列赋值_dataframe根据新列特征的条件为其赋值,给
  13. 【Day08】请简述虚拟 DOM 中 Key 的作用和好处
  14. libuv 原理_Nodejs的运行原理-libuv篇
  15. 基于 YOLOV3 和 OpenCV的目标检测
  16. Web前端知识体系梳理,值得收藏!
  17. 为什么中国没有类似于windows的操作系统?
  18. python3连接redis
  19. 单片机蓝牙模块与手机蓝牙通信(3)
  20. android x86 精简版,逆天!Windows7终极纯净版x86,仅239MB | 殁漂遥

热门文章

  1. 个人电脑的楷模:新款IMac G5
  2. 哪个app最费电_微波炉和烤箱,买哪个划算?
  3. mailing list的原理
  4. 12c分页查询特性FETCH FIRST ROWS,OFFSET ROWS FETCH NEXT ROW LIMIT Clause子句
  5. WPF/MVVM 快速开发
  6. 参赛方案-主机托管、中小企业虚拟化应用
  7. 什么是Session?
  8. 技术分享 | 微服务模式下如何高效进行API测试
  9. .NET 6新特性试用 | record struct
  10. .NET 6 Talk Party 2|.NET Core 与行业