简读《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
  • ...
【简读《ASP.NET Core技术内幕与项目实战》之3:配置】一、直接读取配置
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行可以设置其它配置源:
  • 从命令行读取:configBuild.AddCommandLine(args);
  • 从环境变量读取:configBuild.AddEnvironmentVariables("Test_"),其中Test_为环境变量的前缀,可以实现过滤
  • 其它配置源:INI文件、XML文件、Key-per-file文件、用户机密、第三方配置提供程序等
  • 当在13行,配置多个数据源时,按Add的添加顺序读取,如果多个配置源设置了相同的key,则后面的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 }

经验总结扩展阅读