在系统开发的过程中,我们总是需要使用配置文件来保存一些我们需要保存的系统参数, 毕竟这是.Net时代,如果再使用注册表那就显得复杂了,毕竟操作注册表的API并不是哪么容 易理解的。
所以在.net应用程序中,都默认出现一个App.Config(对于 Web应用程序 是Web.Config)我们可以将系统运行所需要的参数采用加密或者明文的方式保存在这个文件 中。但是当我们需要大量的,并且有一定逻辑结构的数据,希望也能够保存到配置文件中, 此时我们可能这样做:将这些数据构造成DataSet,然后使用DataSet.WriteXML直接写成XML 文件,读取的时候直接使用DataSet.LoadXML。另外一种方式就是直接操作XML数据,使用 XmlDocument。
第一种方法虽然是好,因为我们可以想操作数据库表一样操作我们的 结构化的数据,可是在某些情况下,总觉得怪怪的。并且增加列等等这些的操作觉得及其难 受。特别是我们需要使用这些数据的时候,我们首先要去读文档,了解DataSet中的每个表以 及每个字段的含义,所以此方法不可取。
那第二种方法呢,这个更不可取。如果我们 增加了某个字段,或者修改了数据的机构,那我们的代码修改起来是在也是比较复杂的事情 。
那有什么更好的方式来解决这个问题的呢?
既然微软可以使用App.Config 和Web.Config,可以使用ComfigManager来对这两个配置文件来进行管理,让我们非常方便地 进行使用,那我们为何不可设计自己的ConfigManager呢?
需求:我们这里以菜单结 构作为例子来描述我们的想法。
菜单,包括主菜单项,比如系统里面的“文件 ”,“编辑”等等,包括子菜单,比如“文件”下的“保 存”,“另存为”等,子菜单下也包括下级子菜单。总之这是一个完全结构 化的数据格式,当然使用菜单来举例主要是这东西我们每天都见到,所以很容易理解,如:
public class Menu
{
private string _Name;
private string _Text;
private string _IconName;
//...这里可能还 有其他你需要变量
private SubMenus _SubMenus;
/// <summary>
/// 注意,一定需要一个无参数的构造函数,否则序列化的时候 出错
/// </summary>
public Menu()
: this ("", "", "")
{ }
public Menu (string name, string text, string iconname)
{
this._Name = name;
this._Text = text;
this._IconName = iconname;
this._SubMenus = new SubMenus();
}
/// <summary>
/// 菜单名
/// </summary>
[XmlAttribute("Name")]
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
/// <summary>
/// 菜单Text
/// </summary>
[XmlAttribute("Text")]
public string Text
{
get { return this._Text; }
set { this._Text = value; }
}
/// <summary>
/// 菜单的 图标名
/// </summary>
[XmlAttribute ("IconName")]
public string IconName
{
get { return this._IconName; }
set { this._IconName = value; }
}
/// <summary>
/// 子菜单
/// </summary>
public SubMenus SubMenus
{
get { return this._SubMenus; }
set { this._SubMenus = value; }
}
}