动态【配置文件】之实现(一)
上次,我们分析了“动态”配置文件的基本需求,也基本定下了设计思路。我们今天就来实现第一要素:读写配置文件
按照我们上次的分析要求,我设计了以下几个类
ConfigManager,【配置文件管理类】
Config,【单个配置文件】
ConfigSection,【配置文件中的单个程序节】
三个类依次包含,为了方便程序调用,为此,设计了三个接口,分别由三个类来实现。这样一来,外部调用的程序,只需要知道接口,而不需要引用这个类;
部分定义代码
IConfigManager定义
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary>
2 /// 配置文件管理接口
3 /// </summary>
4 public interface IConfigManager
5 {
6 /// <summary>
7 /// 增加配置文件
8 /// </summary>
9 /// <param name="pCfg">配置文件</param>
10 void AddConfig(IConfig pCfg);
11 /// <summary>
12 /// 删除配置文件
13 /// </summary>
14 /// <param name="pCfg">配置文件</param>
15 void DeleteConfig(IConfig pCfg);
16 /// <summary>
17 /// 定位配置文件
18 /// </summary>
19 /// <param name="pName"></param>
20 /// <returns></returns>
21 IConfig FindConfig(string pName);
22 /// <summary>
23 /// 配置文件是否存在
24 /// </summary>
25 /// <param name="pName"></param>
26 /// <returns></returns>
27 bool HasExist(string pName);
28 /// <summary>
29 /// 默认配置文件后缀
30 /// </summary>
31 string DefaultEx
32 {
33 get;
34 set;
35 }
36 /// <summary>
37 /// 默认配置文件存放位置
38 /// </summary>
39 string DefaultFolder
40 {
41 get;
42 set;
43 }
44 /// <summary>
45 /// 加载目录下的所有配置文件
46 /// </summary>
47 void Load();
48 /// <summary>
49 /// 当前的配置文件
50 /// </summary>
51 IConfig CurrentConfig
52 {
53 get;
54 set;
55 }
56 }
2 /// 配置文件管理接口
3 /// </summary>
4 public interface IConfigManager
5 {
6 /// <summary>
7 /// 增加配置文件
8 /// </summary>
9 /// <param name="pCfg">配置文件</param>
10 void AddConfig(IConfig pCfg);
11 /// <summary>
12 /// 删除配置文件
13 /// </summary>
14 /// <param name="pCfg">配置文件</param>
15 void DeleteConfig(IConfig pCfg);
16 /// <summary>
17 /// 定位配置文件
18 /// </summary>
19 /// <param name="pName"></param>
20 /// <returns></returns>
21 IConfig FindConfig(string pName);
22 /// <summary>
23 /// 配置文件是否存在
24 /// </summary>
25 /// <param name="pName"></param>
26 /// <returns></returns>
27 bool HasExist(string pName);
28 /// <summary>
29 /// 默认配置文件后缀
30 /// </summary>
31 string DefaultEx
32 {
33 get;
34 set;
35 }
36 /// <summary>
37 /// 默认配置文件存放位置
38 /// </summary>
39 string DefaultFolder
40 {
41 get;
42 set;
43 }
44 /// <summary>
45 /// 加载目录下的所有配置文件
46 /// </summary>
47 void Load();
48 /// <summary>
49 /// 当前的配置文件
50 /// </summary>
51 IConfig CurrentConfig
52 {
53 get;
54 set;
55 }
56 }
IConfig定义
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary>
2 /// 单个配置文件
3 /// </summary>
4 public interface IConfig
5 {
6 /// <summary>
7 /// 配置文件名称
8 /// </summary>
9 string Name
10 {
11 get;
12 set;
13 }
14 /// <summary>
15 /// 增加程序节
16 /// </summary>
17 /// <param name="pCfgSec"></param>
18 void AddSection(IConfigSection pCfgSec);
19 /// <summary>
20 /// 删除程序节
21 /// </summary>
22 /// <param name="pCfgSec"></param>
23 void DeleteSection(IConfigSection pCfgSec);
24 /// <summary>
25 /// 定位程序节
26 /// </summary>
27 /// <param name="pName"></param>
28 /// <returns></returns>
29 IConfigSection FindSection(string pName);
30 /// <summary>
31 /// 查询程序节是否存在
32 /// </summary>
33 /// <param name="pName"></param>
34 /// <returns></returns>
35 bool HasExist(string pName);
36 /// <summary>
37 /// 直接读取某个程序节下的设置
38 /// </summary>
39 /// <param name="pSectionName"></param>
40 /// <param name="pKeyName"></param>
41 /// <param name="pDefaultValue"></param>
42 /// <returns></returns>
43 object ReadKeyValue(string pSectionName, string pKeyName, object pDefaultValue);
44 /// <summary>
45 /// 写入某个程序节下,如果此程序节不存在,将创建
46 /// </summary>
47 /// <param name="pSectionName"></param>
48 /// <param name="pKeyName"></param>
49 /// <param name="pValue"></param>
50 void WriteKeyValue(string pSectionName, string pKeyName, object pValue);
51 /// <summary>
52 /// 加载文件,读取全部配置
53 /// </summary>
54 /// <param name="pFileName"></param>
55 void LoadfromFile(string pFileName);
56 /// <summary>
57 /// 设置保存到文件
58 /// </summary>
59 void SaveToFile();
60 /// <summary>
61 /// 自动保存
62 /// </summary>
63 bool AutoSave
64 {
65 get;
66 set;
67 }
68 /// <summary>
69 /// 是否开启文件监测
70 /// </summary>
71 bool Watched
72 {
73 get;
74 set;
75 }
76 /// <summary>
77 /// 此配置文件的文件路径
78 /// </summary>
79 string FileName
80 {
81 get;
82 set;
83 }
84 }
2 /// 单个配置文件
3 /// </summary>
4 public interface IConfig
5 {
6 /// <summary>
7 /// 配置文件名称
8 /// </summary>
9 string Name
10 {
11 get;
12 set;
13 }
14 /// <summary>
15 /// 增加程序节
16 /// </summary>
17 /// <param name="pCfgSec"></param>
18 void AddSection(IConfigSection pCfgSec);
19 /// <summary>
20 /// 删除程序节
21 /// </summary>
22 /// <param name="pCfgSec"></param>
23 void DeleteSection(IConfigSection pCfgSec);
24 /// <summary>
25 /// 定位程序节
26 /// </summary>
27 /// <param name="pName"></param>
28 /// <returns></returns>
29 IConfigSection FindSection(string pName);
30 /// <summary>
31 /// 查询程序节是否存在
32 /// </summary>
33 /// <param name="pName"></param>
34 /// <returns></returns>
35 bool HasExist(string pName);
36 /// <summary>
37 /// 直接读取某个程序节下的设置
38 /// </summary>
39 /// <param name="pSectionName"></param>
40 /// <param name="pKeyName"></param>
41 /// <param name="pDefaultValue"></param>
42 /// <returns></returns>
43 object ReadKeyValue(string pSectionName, string pKeyName, object pDefaultValue);
44 /// <summary>
45 /// 写入某个程序节下,如果此程序节不存在,将创建
46 /// </summary>
47 /// <param name="pSectionName"></param>
48 /// <param name="pKeyName"></param>
49 /// <param name="pValue"></param>
50 void WriteKeyValue(string pSectionName, string pKeyName, object pValue);
51 /// <summary>
52 /// 加载文件,读取全部配置
53 /// </summary>
54 /// <param name="pFileName"></param>
55 void LoadfromFile(string pFileName);
56 /// <summary>
57 /// 设置保存到文件
58 /// </summary>
59 void SaveToFile();
60 /// <summary>
61 /// 自动保存
62 /// </summary>
63 bool AutoSave
64 {
65 get;
66 set;
67 }
68 /// <summary>
69 /// 是否开启文件监测
70 /// </summary>
71 bool Watched
72 {
73 get;
74 set;
75 }
76 /// <summary>
77 /// 此配置文件的文件路径
78 /// </summary>
79 string FileName
80 {
81 get;
82 set;
83 }
84 }
IConfigSection定义
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary>
/// 配置分类
/// </summary>
public interface IConfigSection
{
string SectionName
{
get;
set;
}
void Add(string pKeyName, object pKeyValue);
void Delete(string pKeyName);
object ReadKeyValue(string pKeyName, object pDefaultValue);
void WriteKeyValue(string pKeyName, object pValue);
void SaveToFile();
}
/// 配置分类
/// </summary>
public interface IConfigSection
{
string SectionName
{
get;
set;
}
void Add(string pKeyName, object pKeyValue);
void Delete(string pKeyName);
object ReadKeyValue(string pKeyName, object pDefaultValue);
void WriteKeyValue(string pKeyName, object pValue);
void SaveToFile();
}
由于本次采用ini文件作为配置文件的载体,所以,在读写上就省略了很多方法。甚至在IConfig接口上提供了读写方法,但为了XML文件之类的读写,还是提供了方法定义。
(未完待续...)
只是一个轻轻的过客……