ServiceDescriptor在.net core中的作用就是DI中注入服務元素的描述。每一個元素核心內容部分包括需要注入的服務元素的類型ServiceType,它對應的接口(如果有的話)ImplementationType,以及服務元素的生命周期ServiceLifetime。
源碼中ServiceDescriptor是一個普通類,一共有4個構造函數,分別是如下:
public ServiceDescriptor(Type serviceType, Type implementationType, ServiceLifetime lifetime): this(serviceType, lifetime)
需要帶入服務元素的類型,服務元素對應接口的類型,服務元素的生命周期。
public ServiceDescriptor(Type serviceType, object instance): this(serviceType, ServiceLifetime.Singleton)
需要帶入服務元素的類型,服務元素實例,默認是單例的。
public ServiceDescriptor(Type serviceType, Func<IServiceProvider, object> factory, ServiceLifetime lifetime): this(serviceType, lifetime)
需要帶入服務元素的類型,服務工廠(用於生成服務實例),服務元素的生命周期。
private ServiceDescriptor(Type serviceType, ServiceLifetime lifetime)
需要帶入服務元素的類型,服務元素的生命周期,這個是最基本的構造函數,但是沒有賦予實例對象,所以不公開,不然就不知道這個服務的真實值是什么了,也就沒有注入的意義了。
ServiceDescriptor中有幾個很重要的函數,下面我簡單介紹一下:
第一個:Describe函數,用於生成ServiceDescriptor類,一共有3個重載,分別是如下:
public static ServiceDescriptor Describe(Type serviceType,Func<IServiceProvider, object> implementationFactory,ServiceLifetime lifetime) public static ServiceDescriptor Describe(Type serviceType,Type implementationType,ServiceLifetime lifetime) private static ServiceDescriptor Describe<TService, TImplementation>(ServiceLifetime lifetime) public static ServiceDescriptor Singleton(Type serviceType,object implementationInstance)
它們分別對應上面的構造函數,也就是說為實例化ServiceDescriptor提供另外一種方式
第二個:Singleton函數,用於生成單例化的ServiceDescriptor類,重載方式不另外說明。
第三個:Scoped函數,用於生成服務范圍內的ServiceDescriptor類,重載方式不另外說明。
第四個:Transient函數,用於生成每次不同的ServiceDescriptor類,重載方式不另外說明。
另外,ServiceLifetime 是一個枚舉類型,枚舉內容有Singleton,Scoped,Transient。