.NetCore中三种注入方式的思考
该篇内容由个人博客同步更新!转载请注明出处!
.netcore彻底诠释了“万物皆可注入”这句话的含义,在.netcore中到处可见注入的使用。因此core中也提供了三种注入方式的使用,分别是:
- addtransient:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例
- addscoped:每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例
- 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了),虽然没有报错但我们还是要避免这样使用。
微信关注我哦!(转载注明出处)