配置框架研究

一、Key/Valve形式

代码如下(示例):

  static void Main(string[] args)
        {
            IConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddInMemoryCollection(new Dictionary<string, string> {
                {"Key1","Value1" },
                { "Section1:Key2","Value2"},
                {"Section2:Section3:Key3","Value3" }
            });
            IConfigurationRoot configurationRoot = builder.Build();
            string value1 = configurationRoot["Key1"];
            IConfigurationSection configurationSection = configurationRoot.GetSection("Section1");
            string value2 = configurationSection["Key2"];
            IConfigurationSection configurationSection1 = configurationRoot.GetSection("Section2");
            IConfigurationSection configurationSection2 = configurationSection1.GetSection("Section3");
            string value3 = configurationSection2["Key3"];
            Console.Read();
        }

二、CommandLine形式

1.调试Tab中配置

在这里插入图片描述
配置完后,会自动生成一个launchSettings.json文件,若以后修改可以直接修改这个文件。

代码如下(示例):

 static void Main(string[] args)
        {
            var builder = new  ConfigurationBuilder();
            //builder.AddCommandLine(args);
            #region 命令替换
            var mapping = new Dictionary<string, string>{ { "-k1","CmdLineKey"} };
            builder.AddCommandLine(args, mapping);
            #endregion

            var cftRoot = builder.Build();
            Console.WriteLine($"CmdLineKey:{cftRoot["CmdLineKey"]}");
            Console.WriteLine($"CmdLineKey2:{cftRoot["CmdLineKey2"]}");
            Console.WriteLine($"CmdLineKey3:{cftRoot["CmdLineKey3"]}");
            Console.WriteLine($"CmdLineKey4:{cftRoot["CmdLineKey4"]}");
            Console.ReadKey();
        }

2.命令格式支持

  • 无前缀的 key=value 模式
  • 双中横线模式 --key=value 或 --key value
  • 正斜杠模式 /key=value 或 /key value
  • 替换命令支持单划线 (-) 或双划线 (–)

三、环境变量

1.调试Tab中配置

在这里插入图片描述

配置完后,会自动生成一个launchSettings.json文件,若以后修改可以直接修改这个文件。

2.测试代码

代码如下(示例):

 static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            builder.AddEnvironmentVariables();
            var root = builder.Build();
            Console.WriteLine($"Key1 = {root["Key1"]}");

            var section = root.GetSection("Section");
            Console.WriteLine($"Section's Key2 ={section["Key2"]}");

            var setction2 = root.GetSection("Section1:Section2");//--在代码里解析:
            Console.WriteLine($"double section Key3={setction2["Key3"]}");

            //TestPrefixFilter();
            Console.Read();

        }
        /// <summary>
        /// 前缀过滤
        /// </summary>
        private static void TestPrefixFilter()
        {
            var builder = new ConfigurationBuilder();
            builder.AddEnvironmentVariables("Fisea_");
            var root = builder.Build();
            Console.WriteLine($"Key1 = {root["Key1"]}");

            var section = root.GetSection("Section");
            Console.WriteLine($"Section's Key2 ={section["Key2"]}");
        }

四、Json配置文件

1.新建一个Json文件

代码如下(示例):

{
  "Address": "test address value3112",
  "sourceMap": 3,
  "ClientService": {
    "Id": 200,
    "Name": "Fisea",
    "Sex": true
  }
}

2.测试代码

代码如下(示例):

static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            var root = builder.Build();
            Console.WriteLine($"Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
            Console.ReadKey();
            Console.WriteLine($"Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
            Console.ReadKey();
            var config = new ConfigValve()
            {
                Name="FiseaW",
                Id=101
            };
            //优先使用配置节点ClientService的值,若没有配置,则使用config对象的值
            root.GetSection("ClientService").Bind(config, (binderOpt) => { binderOpt.BindNonPublicProperties = true; });
            Console.WriteLine($"Id={config.Id},Sex={config.Sex},Name={config.Name}");
            //IChangeToken changeToken = root.GetReloadToken();
            ChangeToken.OnChange(() => root.GetReloadToken(), () => { //若配置文件发生变更,则会执行到这里来
                Console.WriteLine($"OnChange,Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
            });
            Console.WriteLine("starting");
            Console.ReadKey();
            Console.WriteLine($"Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
            Console.ReadKey();
            Console.Read();
        }

五、自定义配置

1.实现 IConfigurationSource

代码如下(示例):

class CustomConfigurationSource : IConfigurationSource
    {
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            return new CustomConfigurationProvider();
        }
    }

2.实现 IConfigurationProvider

代码如下(示例):

 class CustomConfigurationProvider : ConfigurationProvider
    {
        Timer timer;
        public CustomConfigurationProvider():base()
        {
            timer = new Timer();
            timer.Elapsed += Timer_Elapsed;
            timer.Interval = 3000;
            timer.Start();
        }

        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Load(true);
        }
        public override void Load()
        {
            Load(false);
        }
        void Load(bool reload)
        {
            this.Data["LastAccessTime"] = DateTime.Now.ToString();
            if (reload)
            {
                base.OnReload();
            }
        }
    }

3.实现 AddXXX 扩展方法

代码如下(示例):

public static class CustomConfigurationBuilderExtensions
    {
        public static IConfigurationBuilder AddCustomConfiguration(this IConfigurationBuilder builder)
        {
            builder.Add(new CustomConfigurationSource());
            return builder;
        }
    }

之所以单独实现这个方法,是为了封装的更好,不然上端需要知道CustomConfigurationSource这个类的细节。

4.测试

代码如下(示例):

static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            builder.AddCustomConfiguration();
            var root = builder.Build();
            ChangeToken.OnChange(() => root.GetReloadToken(), () => {
                Console.WriteLine($"LastAccessTime:{root["LastAccessTime"]}");
            });
            Console.WriteLine($"Starting");
            Console.Read();
        }

六、源码下载

下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值