轻松完成自定义节点配置及读取操作(通用组件)
时间:2010-12-06 来源:Dacey
一、原来自定配置文件的编写方式:
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类(配置集合类)
特点:根据自定义类型读取配置文件
注意:定义属性为string或class类型,集合为泛型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
相关阅读 更多 +










