一 组件包
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.Configuration
二 核心接口
- IConfiguration
- IConfigurationRoot
- IConfigurationSection
- IConfigurationBuilder
示例演示
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddInMemoryCollection(new Dictionary<string, string> { { "key1","vaule1"}, { "section:key2","vaule2"} }); IConfigurationRoot configurationRoot = configurationBuilder.Build(); IConfigurationSection section = configurationRoot.GetSection("section");
三 扩展点
- IConfigurationSource
- IConfigurationProvider
四 命令行配置
添加组件包:Microsoft.Extensions.Configuration.CommandLine
命令行支持格式
- key=value
- --key=value
- --key value
- /key=value
- /key value
示例演示
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddCommandLine(args); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine(configurationRoot["key1"]);
四 环境变量配置
添加组件包:Microsoft.Extensions.Configuration.EnvironmentVariables
对于配置分层键,支持用“__”替换“:”
示例演示
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddEnvironmentVariables(); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine(configurationRoot["key1"]);
五 文件配置
官方支持以下文件配置
- Microsoft.Extensions.Configuration.Ini
- Microsoft.Extensions.Configuration.Json
- Microsoft.Extensions.Configuration.Xml
- Microsoft.Extensions.Configuration.UserSecrets
Json示例演示
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); //optional false 文件不存在抛出异常 //reloadOnChange true 文件发生变化时,重新加载配置 configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine(configurationRoot["key1"]);
六 监听配置变更
核心方法
IChangeToken IConfiguration.GetReloadToken()
示例演示
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine($"key1:{configurationRoot["key1"]}"); //监听配置变更 ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () => { Console.WriteLine($"key1 changed:{configurationRoot["key1"]}"); }); Console.ReadLine();
七 强类型绑定
组件包
- Microsoft.Extensions.Configuration.Binder
示例演示
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Config config = new Config(); /* * json配置文件 * {"Config": {"key1": 1,"key2": 2,"key3": "value3","key4": "value4" } } */ //BindNonPublicProperties true 允许设置私有属性 configurationRoot.GetSection("Config").Bind(config, configureOptions: options => { options.BindNonPublicProperties = true; }); Console.WriteLine(JsonConvert.SerializeObject(config));
八 选项框架
示例演示
public void ConfigureServices(IServiceCollection services) { //选项注入 services.Configure<Config>(Configuration.GetSection("Config")); services.AddMvc(); }
public class HomeController : Controller { private readonly IOptions<Config> _configOptions; public HomeController(IOptions<Config> options) { _configOptions = options; } [HttpGet] public string Index() { return _configOptions.Value.ConnStr; } }
选项配置热更新
- IOptionsSnapshot 作用域生命周期使用
- IOptionsMonitor 单例生命周期使用
九 选项验证
委托验证示例演示
services.AddOptions<Config>() .Configure(options => Configuration.Bind(options)) .Validate(option => { return !string.IsNullOrWhiteSpace(option.ConnStr); }, "字符串不能为空");