欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-20 18:25:08
该篇内容由个人博客 "点击跳转" 同步更新!转载请注明出处! .NetCore彻底诠释了“万物皆可注入”这句话的含义,在.NetCore中到处可见注入的使用。因此core中也提供了三种注入方式的使用,分别是: 1. AddTransient:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是 ......

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

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

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

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

1. 主服务为scoped,次服务为transient时

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

2. 主服务为singleton,次服务为scoped时

.NetCore中三种注入方式的思考
.NetCore中三种注入方式的思考
这种情况直接报错(cannot consume scoped service from singleton),这是因为core防止我们陷入这样的一个陷阱,怕我们误以为每次请求都会创建一个新的实例

3. 主服务为singleton,次服务为transient时

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

微信关注我哦!(转载注明出处).NetCore中三种注入方式的思考