轻松完成自定义节点配置及读取操作(通用组件)
在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

浙公网安备 33010602011771号