轻松完成自定义节点配置及读取操作(通用组件)

      在app.config和web.config中我们通常要用自定义节点来完成想要扩展的配置内容,以前我们需要继承ConfigurationSection,ConfigurationElementCollection,ConfigurationElement这些类来完成配置信息的读取代码比较繁琐复杂。后来有了linq to xml 通过它我们很容易查询出配置信息,但是这样却少了类的定义,只能通过XmlNode来读取或者填充我们定义的类。

一、原来自定配置文件的编写方式:

1、定义类型比较繁琐



internal class AOPConfigurationSection : ConfigurationSection 

    { 

        [ConfigurationProperty("", IsDefaultCollection = true)] 

        public AopElementCollection Aops //需要定义这里略 

        { 

            get 

            { 

                return (AopElementCollection)base[""]; 

            } 

        } 

    }





2、LINQ TO XML查询



XElement xelement = XElement.Parse(xml);  

var name = from e in xelement.Elements("b")  

                 let s = e.Element("e")  

                 select s.Attribute("name").Value;



 

二、通用配置组件介绍

引用:DefinitionConfig.dll

对象:

        DisplayConfigName特性(对应节点名称)

        ReadSection类(初始化节点)

        ConfigSectionsHelper类(配置解析类)

        Sections类(配置集合类)

特点:根据自定义类型读取配置文件

注意:定义子节点属性类型为Sections泛型集合类

方法:GetConfigSection<ConnConfig>();//读取唯一节点类型

        GetConfigSectionChild<ConnConfig>();//读取包含子节点类型

1.自定义类型



public class ConnConfig 

{ 

    [DisplayConfigName("name")]//配置文件中名称为name 

    public string Name { get; set; } 

    public string str{ get; set; }//如果没有声明特性,那么配置文件名称为属性名称str 

}





2.单节点(不含子节点)



//这里section 中type属性为DefinitionConfig.ConfigSectionsHelper,DefinitionConfig



<configSections> 

    <section name="connstr" type="DefinitionConfig.ConfigSectionsHelper,DefinitionConfig"/>



</configSections>



<connstr name="db" str="connstring"></connstr>



或



<connstr str="connstring"> 

   <name>db</name>



   <str>connstring</str> 

</connstr>



上面我们只配置了一个connstr节点。没有任何子节点。注:此节点只能有一个,所以不能多个connstr。



我们把这个配置读取为ConnConfig类型。



ReadSection rs = new ReadSection("connstr");//实例化ReadSection,参数为节点名称



ConnConfig conn= rs.GetConfigSection<ConnConfig>();//通过GetConfigSection读取配置



Console.WriteLine(conn.Name);//验证是否读取到





3、多节点(含子节点)



<configSections> 

    <section name="connstrs" type="DefinitionConfig.ConfigSectionsHelper,DefinitionConfig"/>



</configSections>



<connstrs>



<conn name=”sql” str=”connstring”></conn>



<conn name=”mysql”>



      <str>connstring</str>



</conn>



<conn>



      <name>sqlite</name>



      <str>connstring</str>



</conn>



</connstrs>



ReadSection rs = new ReadSection("connstrs");//读取connstrs节点 

var con = rs.GetConfigSectionChild<ConnConfig>();//GetConfigSectionChild读取子节点配置,注:只要有子节点配置都需要用这个来读取 

foreach (var item in con) 

{ 

      Console.WriteLine(item.Name); 

      Console.WriteLine(item.str); 

}





4、属性为自定义类型(含多个子节点)



public class ConnConfig 

   { 

       [DisplayConfigName("name")] 

       public string Name { get; set; } 

       public ConnString str { get; set; }//定义为类型 

   }



public class ConnString { 

        public string name { get; set; } 

        public string type { get; set; } 

    }



<connstrs> 

  <con> 

    <name>oracle</name> 

    <str name="oracledb"> 

      <type>oracle10</type> 

    </str> 

  </con>



</connstrs>



ReadSection rs = new ReadSection("connstrs"); 

var con = rs.GetConfigSectionChild<ConnConfig>(); 

Console.WriteLine(con[0].str.name);//oracledb





5、属性为自定义集合类型(子节点集合)



public class ConnConfig 

    { 

        [DisplayConfigName("name")] 

        public string Name { get; set; } 

        public ConnString str { get; set; } 

        public Sections<AA> aa { get; set; }//定义集合 

    }



public class ConnString { 

     public string name { get; set; } 

     public string type { get; set; } 

}



public class AA{ 

        public string name{get;set;} 

    }



<connstrs> 

    <con> 

      <name>oracle</name> 

      <str name="oracledb"> 

        <type>oracle10</type> 

      </str> 

      <aa name="1"></aa> 

      <aa> 

        <name>2</name> 

      </aa>     

    </con>



</connstrs>



ReadSection rs = new ReadSection("connstrs"); 

var con = rs.GetConfigSectionChild<ConnConfig>(); 

foreach (var item in con[0].aa) 

{ 

     Console.WriteLine(item.name); 

}





6、属性为自定义多个集合类型(多子节点集合)



public class ConnConfig 

  { 

      [DisplayConfigName("name")] 

      public string Name { get; set; } 

      public ConnString str { get; set; } 

      public Sections<AA> aa { get; set; } 

  } 



  public class ConnString { 

      public string name { get; set; } 

      public string type { get; set; } 

  } 



  public class AA 

  { 

      public string name { get; set; } 

      public Sections<BB> bb { get; set; } 

  } 



  public class BB 

  { 

      public string type { get; set; } 

  }



<connstrs> 

    <con> 

      <name>oracle</name> 

      <str name="oracledb"> 

        <type>oracle10</type> 

      </str> 

      <aa name="1"> 

        <bb type="type1"></bb> 

      </aa> 

      <aa> 

        <name>2</name> 

        <bb type="type2"></bb> 

      </aa>     

    </con>



</connstrs>



ReadSection rs = new ReadSection("connstrs"); 

var con = rs.GetConfigSectionChild<ConnConfig>(); 

foreach (var item in con[0].aa) 

{ 

      Console.WriteLine(item.name); 

}





7、配置外部config



<section name="mySection" type="DefinitionConfig.ConfigSectionsHelper,DefinitionConfig" requirePermission="false" restartOnExternalChanges="false"/>



<mySection configSource="mySection.config"/>



ReadSection rs = new ReadSection("mySection");//读取节点 

var list = rs.GetConfigSectionChild<ConfigItem>();



 



组件下载:DefinitionConfig

组件Demo:ReadConfigDemo

你可能感兴趣的:(自定义)