配置框架

一 组件包

  • 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);
            }, "字符串不能为空");
posted @ 2020-11-05 16:52  2014吕小柯  阅读(93)  评论(0)    收藏  举报