1. 程式人生 > >Asp.Net Core中DI的知識總結

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的銷燬而銷燬。