国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET Core依賴注入系列教程之服務的注冊與提供

2024-07-10 12:48:41
字體:
來源:轉載
供稿:網友

前言

在采用了依賴注入的應用中,我們總是直接利用DI容器直接獲取所需的服務實例,換句話說,DI容器起到了一個服務提供者的角色,它能夠根據我們提供的服務描述信息提供一個可用的服務對象。ASP.NET Core中的DI容器體現為一個實現了IServiceProvider接口的對象。

ServiceProvider與ServiceDescriptor
服務的注冊與提供
    利用ServiceProvider來提供服務
    提供一個服務實例的集合
    獲取ServiceProvider自身對象
    對泛型的支持

一、ServiceProvider與ServiceDescriptor

我一直覺得優秀的設計首先應該是簡單的設計,至少是看起來簡單的設計,這就是我們所謂的大道至簡。作為一個服務的提供者,ASP.NET Core中的DI容器最終體現為一個IServiceProvider接口,我們將所有實現了該接口的類型及其實例統稱為ServiceProvider。如下面的代碼片段所示,該接口簡單至極,它僅僅提供了唯一個GetService方法,該方法根據提供的服務類型為你提供對應的服務實例。

 public interface IServiceProvider { object GetService(Type serviceType); }

ASP.NET Core內部真正使用的是一個實現了IServiceProvider接口的內部類型(該類型的名稱為“ServiceProvider”),我們不能直接創建該對象,只能間接地通過調用IServiceCollection接口的擴展方法BuildServiceProvider得到它。IServiceCollection接口定義在“Microsoft.Extensions.DependencyInjection”命名空間下,如果沒有特別說明,本系列文章涉及到的與ASP.NET Core依賴注入相關的類型均采用此命名空間。 如下面的代碼片段所示,IServiceCollection接口實際上代表一個元素為ServiceDescriptor對象的集合,它直接繼承了另一個接口IList<ServiceDescriptor>,而ServiceCollection類實現了該接口。

 public static class ServiceCollectionExtensions { public static IServiceProvider BuildServiceProvider(this IServiceCollection services); }  public interface IServiceCollection : IList<ServiceDescriptor> {}  Public class ServiceCollection: IServiceCollection { //省略成員 }

體現為DI容器的ServiceProvider之所以能夠根據我們給定的服務類型(一般是一個接口類型)提供一個能夠開箱即用的服務實例,是因為我們預先注冊了相應的服務描述信息,這些指導ServiceProvider正確實施服務提供操作的服務描述體現為如下一個ServiceDescriptor類型。

 public class ServiceDescriptor { public ServiceDescriptor(Type serviceType, object instance); public ServiceDescriptor(Type serviceType, Func<IServiceProvider, object> factory, ServiceLifetime lifetime); public ServiceDescriptor(Type serviceType, Type implementationType, ServiceLifetime lifetime);  public Type ServiceType { get; } public ServiceLifetime Lifetime { get; }  public Type ImplementationType { get; } public object ImplementationInstance { get; } public Func<IServiceProvider, object> ImplementationFactory { get; }  }            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 磴口县| 奇台县| 泰兴市| 嵊州市| 自治县| 峨眉山市| 聂拉木县| 镇远县| 太仆寺旗| 阿城市| 舒城县| 家居| 阜新| 红原县| 仲巴县| 红桥区| 汉寿县| 华阴市| 花垣县| 夏津县| 出国| 长丰县| 清水县| 浦江县| 万山特区| 射阳县| 浙江省| 新乡县| 隆安县| 大城县| 石城县| 德钦县| 温宿县| 伊金霍洛旗| 西丰县| 阿拉善右旗| 无锡市| 萨嘎县| 元阳县| 大同县| 枞阳县|