.NetCore中三种注入方式的思考
原文:.NetCore中三种注入方式的思考

该篇内容由个人博客点击跳转同步更新!转载请注明出处!

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

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

当大家已经过了百度每种注入方式的使用场景后,有没有萌生出一个新的问题:就是一个作用域(Scoped)服务中注入一个瞬时(Transient)服务时,瞬时服务中的值还会每次都变化吗?
出现这个问题是因为:我有两个服务,一个是数据处理服务A(Scoped),一个是从Redis取数据的服务B(Transient),本来想的是处理数据时每次从Redis中新开实例来取数据,但是事与愿违每次Redis实例总是不变,然后自己下载了官方的示例程序研究了一下,在此做个记录,以下为了好区分,我就以主次服务来区分,一共分为几下几种情况:

1. 主服务为Scoped,次服务为Transient时



由图可知,在这种情况下瞬时服务是没用的,两次的结果是一样的。原因是因为scoped服务只有第一次运行的时候是走构造函数的,后面再创建都是直接赋值,而不是创建新对象不走构造函数因此值也不会改变。

2. 主服务为Singleton,次服务为Scoped时



这种情况直接报错(Cannot Consume Scoped Service From Singleton),这是因为Core防止我们陷入这样的一个陷阱,怕我们误以为每次请求都会创建一个新的实例

3. 主服务为Singleton,次服务为Transient时



发现结果也是一样的,而且并没有向上面一样报错,难道微软粑粑就不怕我们陷入这样的一个陷阱吗?我个人觉得原因是这样的:Scoped方式是每个请求时创建一个新的实例,但Transient是每个请求中调用每个服务都会创建一个新的实例,在一次请求中,如果在Singleton中还使用Scoped的话,Scoped和Singleton的意义是一样的(比如我这次请求的时候正常Scoped产生的值是1,我在其它服务中使用的值都将是1,但是在Singleton中保存的值还是0,这样就会产生歧义),但如果Singleton中使用Transient的话只针对当前服务中是唯一的,调用其它服务的时候Transient还是会创建新的实例,因此在其它服务中就不会有其它问题(简单来讲就是默认我在Singleton中调用Transient时我就默认产生的值就为0,反正我每次请求都会产生新的值,无所谓是0还是1,还是2了),虽然没有报错但我们还是要避免这样使用。

微信关注我哦!(转载注明出处)

posted on 2019-07-09 22:13 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/11160831.html

.NetCore中三种注入方式的思考相关推荐

  1. .NetCore中三种注入生命周期的思考

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

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

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

  3. spring三种注入方式

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

  4. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  5. Spring的三种注入方式(为什么推荐构造器注入?)

    Spring的三种注入方式 一.属性注入 @Resource和@Autowired的区别 为什么尽量使用 @Resource? 二.setter 注入 三.构造器注入 具体可以看看Spring官网 为 ...

  6. 扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

    循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...

  7. Spring 的三种注入方式?

    1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...

  8. Spring 的三种注入方式,到底哪种注入方式最佳?

    1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...

  9. selenium中三种等待方式:sleep,implicitly_wait,WebDriverWait

    三种等待方式:sleep 强制等待, sleep,设置等待多长时间,就要等待多长时间.等待完成后,才会继续下一步: from selenium import webdriver # 导入sleep f ...

最新文章

  1. 雪上加霜!股东向 Zoom 发起集体诉讼,索赔高额补偿
  2. 免费教材丨第51期:数学基础课程----概率论教程、机器学习中的数学基础
  3. 【Cucumber】【命令行】
  4. 如何解决make: Nothing to be done for `all‘ 的方法
  5. rust(22)-不可变字符串借用
  6. Centos 7下安装nginx,使用yum install nginx,提示没有可用的软件包(亲测)
  7. CentOS7Selinux设置
  8. mysql 优化表的作用_mysql实战优化之三:表优化
  9. 语言中的petchar运用_还在担心你家孩子发音、语言问题?12个表现、3个预防是重点...
  10. FF:与吉利控股的合作取得实质性进展 双方技术团队正紧密对接
  11. 阿里天池全国社保比赛心得
  12. HttpComponents组件探究 - HttpClient篇
  13. c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)
  14. git不能上传空目录和设备文件
  15. 给自己的IntelliJ IDEA 设置签名
  16. 头像照片汇聚logo视频片头ae竖屏模板
  17. 一个由两个长的如此相像的字引起的问题
  18. 2019最新千峰PHP全套教程(最新完整)
  19. ADAMS-Simulink联合仿真-零基础(一)
  20. AI“头雁”百度的进取之道:善弈者通盘无妙手

热门文章

  1. python collections(容器)模块
  2. 45.UITableView去除分割线
  3. JAVA遍历21位数
  4. js地址栏获取参数的方法,解决中文乱码问题,能支持中文参数
  5. AD Framework 单点登录
  6. 查看静态库(.a文件)内容
  7. Linux磁盘管理之磁盘结构、概念、原理01
  8. angularjs--控制器的显示与隐示使用
  9. HTML基础 DOM概览(第一天)
  10. ECCV 2020 论文大盘点-视频理解与分类篇