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

特別說明:1、本系列內容主要基于楊中科老師的書籍《ASP.NET Core技術內幕與項目實戰》及配套的B站視頻視頻教程,同時會增加極少部分的小知識點2、本系列教程主要目的是提煉知識點,追求快準狠,以求快速復習,如果說書籍學習的效率是視頻的2倍,那么“簡讀系列”應該做到再快3-5倍
本節內容 , 涉及3.2(P60-P69),7.2(P188-P193),NuGet包
  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.Configuration.CommandLine
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Options
  • ...
一、直接讀取配置
1 //appsetting.json文件,需設置為“如果較新則復制” 2 { 3"name": "functionMC", 4"proxy": { 5"address": "192.1.1.1", 6"port": 1088 7} 8 } 91011 //Program.cs12 ConfigurationBuilder configBuilder = new ConfigurationBuilder();13 configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange:false);14 IConfigurationRoot config = configBuilder.Build();1516 string name = config["proxy:address"];17 Console.WriteLine(name);1819 string proxyAddress = config.GetSection("name").Value;20 Console.WriteLine(proxyAddress);代碼解釋:
12-13行:構建ConfigurationBuild對象,并調用該對象的AddJsonFile方法,加載Json配置文件
14行:調用ConfigurationBuild對象的Build方法,構建IConfigurationRoot對象-config,用于讀取配置
16行:通過config["key"]方式,讀取key值,讀取聯級key的方式 , 與config.GetSection一致 , "proxy:address"
19行:通過config.GetSection方法 , 讀取key值
補充說明:
①涉及類型: ConfigurationBuild(配置)、IConfigurationRoot(讀?。?體現面向接口編程,根據不同的配置源有不同的實現
②13行可以設置其它配置源:
  • 從命令行讀?。篶onfigBuild.AddCommandLine(args);
  • 從環境變量讀?。篶onfigBuild.AddEnvironmentVariables("Test_"),其中Test_為環境變量的前綴,可以實現過濾
  • 其它配置源:INI文件、XML文件、Key-per-file文件、用戶機密、第三方配置提供程序等
  • 當在13行,配置多個數據源時 , 按Add的添加順序讀??,染J喔讎渲迷瓷柚昧訟嗤膋ey,則后面的key值覆蓋前面的key值
  • 在ASP.NET Core , 已經默認添加了多個配置源 , 添加順序為appsettings.json < appsettings.[運行時環境變量].json< 用戶機密 < 環境變量 < 命令行
③在VS上設置命令行參數和環境變量的入口,項目右擊>屬性>調試>打開調試啟動配置文件UI 。用戶機密入口,項目右擊>管理用戶機密
二、通過選項方式讀取
1 //appsettings.json文件 2 { 3"Smtp": { 4"Server": "smtp.youzack.com", 5"UserName": "functionMC", 6"Password": "hello123" 7}, 8"Db": { 9"DbType": "SQLServer",10"ConnectionString": "Data..."11}12 }131415 //兩個與配置Smtp和Db關聯的類16 //SmtpSettings.cs17 class SmtpSettings18 {19public string Server { get; set; }20public string UserName { get; set; }21public string Password { get; set; }22 }2324 //DbSettings.cs25 class DbSettings26 {27public string DbType { get; set; }28public string ConnectionString { get; set; }29 }303132 //配置、選項綁定,并調用一個方法來讀取配置33 //Program.cs34 ConfigurationBuilder configBuilder = new ConfigurationBuilder();35 configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange:true);36 IConfigurationRoot config = configBuilder.Build();3738 ServiceCollection services = new ServiceCollection();39 services.AddOptions()40.Configure<DbSettings>(e=>config.GetSection("Db").Bind(e))41.Configure<SmtpSettings>(e=>config.GetSection("Smtp").Bind(e));4243 services.AddTransient<ReadOptions>();4445 using (var sp = services.BuildServiceProvider())46 {47while (true)48{49using (var scope = sp.CreateScope())50{51var sp_scope = scope.ServiceProvider;52var readOptions = sp_scope.GetRequiredService<ReadOptions>();53readOptions.Read();54}55Console.WriteLine("修改appsettings后 , 按任意鍵讀取最新的配置");56Console.ReadKey();57}58 }596061 //讀取配置的方法類62 //ReadOptions.cs63 class ReadOptions64 {65private readonly IOptionsSnapshot<SmtpSettings> optSmtpSettings;66private readonly IOptionsSnapshot<DbSettings> optDbSettings;6768public ReadOptions(IOptionsSnapshot<SmtpSettings> optSmtpSettings, IOptionsSnapshot<DbSettings> optDbSettings)69{70this.optSmtpSettings = optSmtpSettings;71this.optDbSettings = optDbSettings;72}7374public void Read()75{76var smtp = optSmtpSettings.Value;77var db = optDbSettings.Value;78Console.WriteLine(smtp.UserName);79Console.WriteLine(db.DbType);80}81 }

推薦閱讀