需求
為了達到自動讀寫的目的,我們需要滿足如下需求:
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;
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#region Public Propertys
public String Name
{
get
{
return m_Name;
}
set
{
m_Name = value;
}
}
[ConfigurationIgnore]
[XmlIgnore]
public int RandId
{
get
{
return m_RandId;
}
set
{
m_RandId = value;
}
}
#endregion
}
}
這個實體類包括兩個公有屬性Name 和 RandId,其中RandId不希望配置到文件中,所以用 [ConfigurationIgnore] 和 [XmlIgnore]兩個屬性描述這個字段。其中[ConfigurationIgnore] 屬性是本組件提供的屬性,可以用於描述任何配置模式下的字段屬性。
配置文件名在實體類構造中指明,如果你不希望在構造中指明,你也可以在打開實體類之前的任何時候通過FileName屬性動態賦值。
使用實體類的示例代碼:
MyXmlCfg myXmlCfg = new MyXmlCfg();
myXmlCfg.Open();
Console.WriteLine(String.Format("Name:{0} RandId:{1}", myXmlCfg.Name, myXmlCfg.RandId));
myXmlCfg.Close();
使用實體類很簡單,只要打開(Open)實體類,組件會自動將配置文件中的數據讀取到實體類中。你可以直接使用。
如果你修改了實體類中的公共屬性,比如你調用了如下語句 myXmlCfg.Name="MyName",關閉(Close)實體類時,組件會自動將新的配置寫入到配置文件中。
你也可以設置你的實體類為制度,myXmlCfg.ReadOnly = true; 只讀的實體類,在關閉時不保存配置。
INI 格式實體類的實現和使用
一個簡單的實體類例子:
using System;
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#region Public Propertys
[Section("PrivateInfo")]
public String Name
{
get
{
return m_Name;
}
set
{
m_Name = value;
}
}
[Section("PrivateInfo")]
[Key("Age", 18)]
public byte Age
{
get
{
return m_Age;
}
set
{
m_Age = value;
}
}
[Section("ClassInfo")]
[Key("Class")]
public String ClassName
{
get
{
return m_ClassName;
}
set
{
m_ClassName = value;
}
}
[Section("ClassInfo")]
[Key("Year", 1945)]
public uint Year
{
get
{
return m_Year;
}
set
{
m_Year = value;
}
}
[ConfigurationIgnore]
public int RandId
{
get
{
return m_RandId;
}
set
{
m_RandId = value;
}
}
#endregion
}
}
INI 配置模式,提供如下屬性(Attribute)
[ConfigurationPattern(TPattern.INI, "DefaultSection")]
ConfigurationPattern 屬性中模式必須指定為TPattern.INI,第二個參數是默認Section,必須要指定!
[Section] 屬性,這個屬性指定對應字段所屬的Section,如[Section("PrivateInfo")],如果不指定這個屬性,則認為該字段屬於默認Section
[Key] 屬性,該屬性指定字段在配置文件中的鍵名,默認值,以及鍵的大小。如果不指定這個屬性,默認為鍵名為字段名,默認值為實體類初始化時該字段的默認值。
簡單使用示例
MyIniCfg myIniCfg = new MyIniCfg();
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();
使用方法和XML模式的實體類是一樣的,其實任何模式的實體類使用方法都是一樣的。
添加自己的配置模式實現
添加自己的配置模式只需做如下兩件事:
1、修改 ConfigurationPatternAttribute.cs 中的TPattern,增加自定義的模式名稱
2、模仿我寫的兩個模式接口實現,寫一個自己的接口實現