[Parctice Note] ConfigSections配置使用

当前讲述的是控制台项目下的App.config文件配置使用

单节点特性实现

第一步新建控制台项目 TestRedis,确认项目是否引用了System.Configuration
如果没有,手动添加Nuget包

第二步新建配置文件实体类RedisConfig.cs 继承 ConfigurationSection

namespace TestRedis
{
    public class RedisConfig:ConfigurationSection
    {
        public static RedisConfig GetConfig()
        {
            return GetConfig("RedisConfig");
        }
        /// <summary>
        /// 配置文件Redis链接字符
        /// </summary>
        /// <param name="sectionstring"></param>
        /// <returns></returns>
        public static RedisConfig GetConfig(string sectionname)
        {
            RedisConfig section=(RedisConfig)ConfigurationManager.GetSection(sectionname);
            if (section==null)
            {
                throw new ConfigurationErrorsException("Section["+ sectionname + "] is not found");
            }
            return section;
        }
        /// <summary>
        /// 可写的Redis链接地址,IsRequired为false时,节点可以忽略该特性配置
        /// </summary>
        /// 
        [ConfigurationProperty("WriteServerConStr", DefaultValue ="",IsRequired =true,IsKey =false)]
        public string WriteServerConStr
        {
            get
            {
                return (string)base["WriteServerConStr"];
            }
            set
            {
                base["WriteServerConStr"] = value;
            }
        }
        /// <summary>
        /// 可读的Redis链接地址
        /// </summary>
        /// 
        [ConfigurationProperty("ReadServerConStr", DefaultValue = "", IsRequired = true, IsKey = false)]
        public string ReadServerConStr
        {
            get
            {
                return (string)base["ReadServerConStr"];
            }
            set
            {
                base["ReadServerConStr"] = value;
            }
        }

        [ConfigurationProperty("MaxWritePoolSize", DefaultValue = "", IsRequired = true, IsKey = false)]
        public string MaxWritePoolSize
        {
            get
            {
                return (string)base["MaxWritePoolSize"];
            }
            set
            {
                base["MaxWritePoolSize"] = value;
            }
        }
        
    }
}

上述代码,是意思获取RedisConfig自定义节点下的WriteServerConStr,…特性
配置文件新增自定义配置


  <!--type定义 命名空间.类名,类所在的程序集名-->
  <configSections>
      <section name="RedisConfig" type="TestRedis.RedisConfig,TestRedis"/>
  </configSections>

    <RedisConfig WriteServerConStr="112233" ReadServerConStr="1111111" MaxWritePoolSize="10"/>

测试下

	class Program
    {
        static void Main(string[] args)
        {
            var config = RedisConfig.GetConfig();
            Console.WriteLine(config.WriteServerConStr);
            Console.WriteLine(config.ReadServerConStr);
            Console.WriteLine(config.MaxWritePoolSize);
            Console.ReadLine();
        }
    }

多节点key/value实现

继上面的内容,我们将App.Config文件修改

 <configSections>
      <section name="RedisConfig" type="TestRedis.RedisConfig,TestRedis"/>
          <!--分组添加节点-->
    <sectionGroup name="MyConfig">
      <section name="Default"
         type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <section name="myNameValue"
          type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </sectionGroup>
        <!--分组添加节点-->
  </configSections>

    <RedisConfig WriteServerConStr="112233" ReadServerConStr="1111111" MaxWritePoolSize="10"/>

  <MyConfig>
    <Default>
      <add key="Area" value="Default-Fuzhou"/>
      <add key="Device" value="Default-Printer"/>
      <add key="Customer" value="Default-Muf"/>
    </Default>
    <myNameValue>
      <add key="Area" value="myNameValue-Fuzhou"/>
      <add key="Device" value="myNameValue-Printer"/>
      <add key="Customer" value="myNameValue-Muf"/>
    </myNameValue>  
  </MyConfig>

添加实体类 MyConfig.cs

namespace TestRedis
{
    public class MyConfig : NameValueCollection    //DictionarySectionHandler SingleTagSectionHandler 实例返回Hashtable,配置文件也需要修改节点type属性
    {

        //如果继承的是DictionarySectionHandler,SingleTagSectionHandler 这里的 NameValueCollection 用 Hashtable 取代
        public static NameValueCollection GetConfig()
        {
            return GetConfig("MyConfig/Default");
        }


        //如果继承的是DictionarySectionHandler,SingleTagSectionHandler 这里的 NameValueCollection 用 Hashtable 取代
        public static NameValueCollection GetConfig(string sectionname)
        {

            var config = (NameValueCollection)ConfigurationManager.GetSection(sectionname);
            if (config == null)
                throw new ConfigurationErrorsException("Not found the section:["+sectionname+"]");
            return config;
        }

        ///
    }
}

测试下

 class Program
    {
        static void Main(string[] args)
        {
        	//默认取MyConfig/Default节点下的 key/value
            var myconfig = MyConfig.GetConfig();
            Console.WriteLine(myconfig["Area"]);
			
			//取MyConfig/Default节点下的 key/value
            var myconfig1 = MyConfig.GetConfig("MyConfig/myNameValue");
            Console.WriteLine(myconfig1["Device"]);

            Console.ReadLine();


        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值