ASP.NET CORE 中自动集成了应用配置,支持从以下 源 处获取配置键值对
- 命令行
- 环境变量
- 内存
- 文件配置
其中文件配置是我们最常用的方式,默认文件是.json的json格式文件,摒弃了以往.config的xml的文件格式。
应用配置有以下几个约定:
- 键不区分大小写,如果存在相同的键,则取最后一个值
- 分层键 : 取子节点。或者__双下划线
- 值默认为字符串
- 不存储NULL值
那么
问:配置文件是如何加载的呢?
答:默认加载appsettings.json,如果有自定义的文件需要加载,则需要在WEBHOST初始化时添加文件路径。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { //config.SetBasePath(Directory.GetCurrentDirectory());//如果iis调试,请注释 config.AddJsonFile("appsettings_ext.json", optional: false, reloadOnChange: false); }) .UseStartup<Startup>();
问:如果获取配置文件内容
答:IConfiguration。支持在任何地方注入。并有以下几个主要获取Value的方法
配置文件示例:
"one": "1", "two": { "_two": "2" }, "fourToSeven": [ "4", "5", "6", "7" ], "People": { "Name": "gt", "Male": "1" }, "Books": [ { "Name": "语文" }, { "Name": "数学" } ]
取值方式
//直接获取键值对的Value _configuration.GetValue<string>("one"); //获取子节点的Value,使用约定: _configuration.GetValue<string>("two:_two"); //或者获取section的子节点,再去获取Value _configuration.GetSection("two").GetChildren().First(x => string.Equals("_two", x.Key, StringComparison.CurrentCultureIgnoreCase)); //获取数组的方式,本质是一个 _configuration.GetSection("fourToSeven").Get<string[]>();
问:实际应用中我们通常使用类对象来表示配置,.NET CORE里面是如何绑定到类的
答:.NET CORE提供了Bind方法来将配置绑定到类,另外还提供了Options方式来实现
//获取Section绑定到对象类,注意对象类的属性值要和配置中一致 var user = new People(); _configuration.GetSection("People").Bind(user); _people = user; //也可以采用万能的Get方式,更为简洁 _configuration.GetSection("people").Get<People>(); public class People { public string Name { get; set; } public int Male { get; set; } }
Options方式应该是我们日常应用中常用的方式,毕竟IConfiguration需要在使用的地方注入,且需要知道KEY,这就形成了硬编码模式。
我们先定义一个Options,
public class BookOptions { public string Name { get; set; } }
那么我们可以在Startup类的ConfigureServices中进行 配置。
services.Configure<List<BookOptions>>(Configuration.GetSection("books")); //这种方式可以给配置项目一个名称,获取的时候根据名称获取 services.Configure<List<BookOptions>>("myname",Configuration.GetSection("books"));
使用Options也是通过注入的方式使用(万恶的.NET CORE,无处不在注入)。.NET CORE使用 IOptionsMonitor<T>注入的方式,同时其也控制着Options生命周期 。
private readonly List<BookOptions> _books;
private readonly List<BookOptions> _booksNamed;
public ConfigController(IConfiguration configuration, IOptionsMonitor<List<BookOptions>> bookAccessor, IOptionsSnapshot<List<BookOptions>> bookNamedAccessor) { _configuration = configuration; _books = bookAccessor.CurrentValue; _booksNamed = bookNamedAccessor.Value; }
IOptionsSnapshot<TOptions> 支持包含最小处理开销的重新加载选项。针对请求生存期访问和缓存选项时,每个请求只能计算一次选项。
.NET CORE配置使用大抵如此,当然实际应用中可能会更复杂点,其也提供了很多扩展方法。