Asp.Net Core中DI的知识总结

在asp.net core中DI的概念是由这几部分组成的:

IServiceCollection,保存IServiceDescriptor实例的列表

IServiceProvider,只有一个方法GetService,用来获取服务。ServiceProvider由一个Scope的概念,是通过CreateScope(它又调用了IServiceScopeFactory)来创建一个IServiceScope,这个IServceScope中包含一个新创建的IserviceProvider。

IServiceDescriptor,用来描述服务,包括service type,Implementation type,service life time.

ServiceLifeTime,描述服务的生命周期,有三种生命周期:

Singleton

Scope

Transient

DI就是由上述这四个主要的类型外加一大堆扩展方法而形成的。

ServiceProvider作为DI容器,内部维护一个已注册服务的列表,第一个产生的ServiceProvider叫做根容器,通过它创建的容器叫做子容器,所有创建的ServiceProvider都共享这个已注册服务的列表。

三种生命周期的注册方式也主要是通过将服务注册在根容器还是子容器来达到目的的。并且,如果一个服务实现了IDisposable接口,相应的,容器也会负责调用服务的Dispose方法。也就说,服务注册在哪里,哪里就服务销毁它。

Singleton

单例模式。IServiceProvider作为DI容器,单例模式的服务会被注册到根容器上面。它的生命周期会随根容器的销毁而销毁,也就是说,应用程序停掉了它才会销毁。

Scope

Scope实际上是由一个IServiceScope接口来描述的,上面有写,它是由ServiceProvider的一个扩展方法CreateScope来实现的,内部由IserviceScopeFacrory来最终生成一个Scope,这个Scope生成的时候会创建一个新的ServiceProvider,利用新生成的ServiceProvider来提供的服务也就形成了一个Scope的概念。顺便插一句,任何一个ServiceProvider都由一个根容器的引用,所以的Provider都引用了同一个根容器。它的生命周期随创建它的ServiceProvider的销毁而销毁,在asp.net core里面,当客户端发起请求时,都会新创建一个Scope,然后都是利用这个新创建的Scope中的ServiceProvider属性来提供服务的。

Transient

随用随取,用完就销毁。它的生命周期通Scope,都是随创建它的ServiceProvider的销毁而销毁。

猜你喜欢

转载自www.cnblogs.com/pangjianxin/p/10115787.html