簡讀《ASP.NET Core技術內幕與項目實戰》之3:配置( 二 )

代碼解釋:
17-29行:定義兩個類(選項類),分別映身appsettings的兩個屬性 。SmtpSettings.cs映射Smtp屬性,DbSettings.cs映射Db屬性,名字一一對應
38行:構建依賴注入的容器
39-41行:注冊選項服務AddOptions,并設置“選項類和配置文件屬性”之間的映射關系 。這樣寫也可以:services.AddOption;services.Configure<DbSettings>......
43行:將讀取配置的類注冊為瞬時服務(ReadOptions) , 這樣在后面循環讀取配置時,每次都能創建一個新的服務
45-58行:通過服務定位器的方式獲取服務(ReadOptions對象),使用了子域方式,稍顯復雜 , 主要目的是測試修改appsettings時的實時更新
63-81行:以依賴注入的方式,注入讀取配置的服務 , 注意不能直接使用SmtpSettings或DbSettings,需要使用IOptions<T>泛型接口
補充說明:
①讀取配置的泛型接口,有三種:IOptions<T>(類似單例),IOptionsMonitor<T>(類似范圍),IOptionsSnapshot<T>(類似瞬時) 。以上案例,改成另外兩個 , 都無法實現配置信息的實時更新 。其中IOptions<T>,需要重啟應用;IOptionsMonitor<T>,重啟應用 , 或者修改代碼,不在Scope中讀取
三、在ASP.NET Core中設置和讀取配置(本節有補充知識點)
1 //appsettings.json文件 2 { 3"Smtp": { 4"Server": "192.1.1.1", 5"UserName": "functionMC", 6"Password": "123456" 7} 8 } 91011 //選項類SmtpSettings.cs12 public class SmtpSettings13 {14public string Server { get; set; }15public string UserName { get; set; }16public string Password { get; set; }17 }181920 //使用MiniApi方式,直接在Program中設置選項綁定和讀取配置21 var builder = WebApplication.CreateBuilder(args);22 builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("Smtp"));2324 var app = builder.Build();2526 app.MapGet("/", (IConfiguration config,IOptions<SmtpSettings> smtpOptions) =>27 {28return $"直接讀?。簕config["Smtp:UserName"]} , 選項讀?。簕smtpOptions.Value.UserName}";29 });3031 app.Run();代碼解釋:
21行:CreateBuilder完成一系列框架設置,包括配置體系(AddJsonFile , AddOptions等),所以不需要手動設置配置體系,框架自動設置多配置源
22行:綁定選項類和配置屬性 。在Program中不方便注入,通過調用build的屬性Configuration , 返回IConfiguration接口讀取配置(區別于.NET中的IConfigurationRoot)
26行:通過MiniApi的參數注入兩個服務,IConfigurations和IOptions<T> , 均由框架自動注冊 。如果使用控制器,可通過構造函數方式注入
28行:使用兩種方式讀取配置:直接讀取配置、通過選項方式讀取配置
【簡讀《ASP.NET Core技術內幕與項目實戰》之3:配置】

推薦閱讀