NetCore自带DI容器的三种生命周期浅析
NetCore自带的依赖注入框架,分别由三种生命周期:单例Singleton/瞬时Transient/一次请求Scoped.接下来我将针对这三种生命周期简要的进行使用方法的解析,并不深入,希望各位大佬多多指教。
各生命周期的区别
Singleton:单例,整个程序启动后只存在唯一一份,如同单例模式一样
Transient:瞬时,每一个对象都是不一样的实例
前两者,都是从root容器中获取实例
Scoped:一次请求,即一次Http请求,获取的实例都是同一个,且是从子容器中获取,其实现原理也正是因为从子容器中获取的特点,而可以实现一次请求一个实例
下面是实例:
我自己写了三个接口以及他们对象的实现,取名自动对应上面三个生命周期
ITransientService TransientService
IScopedService ScopedService
ISingletonService SingletonService
分别在实现里面定义了一个变量i,通过这个变量i来观察他们的生命周期。
各生命周期接口实现代码截图如下:
注入各生命周期接口以及实现截图如下:
运行结果截图如下:
从运行的结果中可以看出,Transient对象每一个都是不同的,Scoped对象在一次请求中,无论获取多少个,都是同一个,Singleton对象整个程序中只有唯一一份。
各生命周期在实际开发中都用在什么场景
Singleton:单例,主要用在例如数据库,Options,IHostService(netcore自带后台服务跟随程序启动而启动)的注入这些,只需要一次实例化就永久保持,不需要每一次都去获取新的实例
Transient:这个就可以应用在比如领域驱动设计中的应用层Services中
Scoped:这个可以用在数据库的上下文中,事务处理等
同一接口实现或同一对象注入到不同的生命周期中会出现什么情况
这里说的是:如果我把ITransientService这个接口及其实现分别注入到三种生命周期中,这个时候会表现