一个用C#编写的自动读写配置文件的开源组件
作者:肖波
摘要
在项目开发中经常要读写那些以各种格式存放的配置文件,每次为了读写这些文件都要编写一堆代码,非常麻烦。于是最近终于下定决心,写一个自动读写配置文件的组件,以便达到一劳永逸的效果。
需求
为了达到自动读写的目的,我们需要满足如下需求:
1、 对于不同格式的配置文件,只需添加相应的配置模式接口实现,就可以使组件自动读取相同格式的配置文件。
2、 可以方便设置不同模式下的参数,比如Ini配置文件,我们需要设置Section, Key,DefautValue等参数。
3、 所有的自动读写过程都在基类中封装实现,使用者无需关心配置文件的格式,也无需象过去那样必须从配置文件中将对应的字段一一读出并逐个赋值给实体中对应字段。使用者只需要从基类派生一个实体类,并定义该实体类中的属性字段就可以了。
4、 根据配置文件,自动生成实体类的工具
5、 支持格式:支持三种通用的配置文件格式,分别是XML,INI和注册表。用户可以参照这三种配置模式,编写自己的特殊格式的模式接口实现。
版本规划
V1.0 实现需求1、2、3。并提供XML,INI两种配置文件格式的模式接口实现
V1.1 提供Registry配置格式的模式接口实现
V1.2 提供前三种模式的实体类自动生成工具
设计思路
如上图所示整个组件由三部分组成:
Configuration 类是所有配置文件实体类的基类。所有实体类都是这个基类的派生类。
IConfigurationPattern 是配置模式的接口
第三部分是配置模式接口的实现类,目前有两种配置模式 XmlPattern 和 IniPattern。
使用简介
XML 格式实体类的实现和使用
一个简单的实体类例子:
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using ConfigurationPattern;
namespace CfgSample
{
[ConfigurationPattern(TPattern.XML)]
public class MyXmlCfg: Configuration
{
const String MY_XML_CFG_PATH = @"\myxmlcfg.xml";
public MyXmlCfg()
: base(MY_XML_CFG_PATH)
{
Random rand = new Random();
m_RandId = rand.Next();
}
private String m_Name;
private int m_RandId;
Public Propertys
}
}
这个实体类包括两个公有属性Name 和 RandId,其中RandId不希望配置到文件中,所以用 [ConfigurationIgnore] 和 [XmlIgnore]两个属性描述这个字段。其中[ConfigurationIgnore] 属性是本组件提供的属性,可以用于描述任何配置模式下的字段属性。
配置文件名在实体类构造中指明,如果你不希望在构造中指明,你也可以在打开实体类之前的任何时候通过FileName属性动态赋值。
使用实体类的示例代码:
myXmlCfg.Open();
Console.WriteLine(String.Format("Name:{0} RandId:{1}", myXmlCfg.Name, myXmlCfg.RandId));
myXmlCfg.Close();
使用实体类很简单,只要打开(Open)实体类,组件会自动将配置文件中的数据读取到实体类中。你可以直接使用。
如果你修改了实体类中的公共属性,比如你调用了如下语句 myXmlCfg.Name="MyName",关闭(Close)实体类时,组件会自动将新的配置写入到配置文件中。
你也可以设置你的实体类为制度,myXmlCfg.ReadOnly = true; 只读的实体类,在关闭时不保存配置。
一个简单的实体类例子:
using System.Collections.Generic;
using System.Text;
using ConfigurationPattern;
using ConfigurationPattern.Patterns;
namespace CfgSample
{
[ConfigurationPattern(TPattern.INI, "DefaultSection")]
class MyIniCfg : Configuration
{
const String MY_INI_CFG_PATH = @"\myxmlcfg.ini";
public MyIniCfg()
: base(MY_INI_CFG_PATH)
{
Random rand = new Random();
m_RandId = rand.Next();
}
private String m_Name;
private byte m_Age;
private int m_RandId;
private String m_ClassName;
private uint m_Year;
Public Propertys
}
}
INI 配置模式,提供如下属性(Attribute)
[ConfigurationPattern(TPattern.INI, "DefaultSection")]
[Section] 属性,这个属性指定对应字段所属的Section,如[Section("PrivateInfo")],如果不指定这个属性,则认为该字段属于默认Section
[Key] 属性,该属性指定字段在配置文件中的键名,默认值,以及键的大小。如果不指定这个属性,默认为键名为字段名,默认值为实体类初始化时该字段的默认值。
简单使用示例
myXmlCfg.ReadOnly = true;
myIniCfg.Open();
Console.WriteLine(String.Format("Name:{0} Age:{1}, RandId:{2}", myIniCfg.Name, myIniCfg.Age, myIniCfg.RandId));
Console.WriteLine(String.Format("ClassName:{0} Year:{1}", myIniCfg.ClassName, myIniCfg.Year));
myIniCfg.Close();
1、修改 ConfigurationPatternAttribute.cs 中的TPattern,增加自定义的模式名称
2、模仿我写的两个模式接口实现,写一个自己的接口实现
源码位置
最新更新
一个用C#编写的自动读写配置文件的开源组件-V1.0.2版本
最新版本 ConfigurationPattern V1.1.1