全局配置文件也面向服务了
在面向服务中讲配置文件,肯定是要把它与具体领域分离,即它有普遍的一般性。在程序开发过程中,难免会用到一些易变性,全局的常量信息,我们通常的作法是把它们放在Web.config或者自定义的文件中,当然你的配置文件可以是XML,二进制的等等,但一般时候我们选择用XML标准的文件。
看全局配置项目的结构如下:
下面我来介绍一下每个文件的使用:
ConfigFactory它是一个配置文件的工厂类,作用当然就是“从配置文件中生产对象”了,呵呵。(这讲不考虑性能问题)
1 /// <summary>
2 /// 配置信息生产工厂
3 /// </summary>
4 public class ConfigFactory
5 {
6 #region 私有
7
8 /// <summary>
9 /// 配置文件管理类
10 /// </summary>
11 static ConfigFilesManager cfm;
12
13 #endregion
14
15 #region 公开的属性
16 public T GetConfig<T>() where T : IConfiger
17 {
18 string configFilePath = string .Empty;
19 string filename = typeof (T).Name;
20
21 HttpContext context = HttpContext.Current;
22 string siteVirtrualPath = string .IsNullOrEmpty(ConfigurationManager.AppSettings[ " SiteVirtrualPath " ]) ?
23 " / " : ConfigurationManager.AppSettings[ " SiteVirtrualPath " ];
24 if (context != null )
25 {
26 configFilePath = context.Server.MapPath( string .Format( " {0}/Configs/{1}.Config " , siteVirtrualPath, filename));
27 }
28 else
29 {
30 configFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @" Configs\{0}.Config " , filename);
31 }
32
33 if (! File.Exists(configFilePath))
34 {
35 throw new Exception( " 发生错误: 网站 " +
36 new FileInfo( " fileName " ).DirectoryName
37 + " 目录下没有正确的.Config文件 " );
38 }
39
40 cfm = new ConfigFilesManager(configFilePath, typeof (T));
41 return (T)cfm.LoadConfig();
42 }
43 #endregion
44
45 }
ConfigFileManager它是一个对文件进行管理的类,它将配置文件反序列化成对象,并提供一段时间后,自动生成新版本的对象,为了线程安全,使用了lock
1 /// <summary>
2 /// 基本文件配置信息管理者
3 /// </summary>
4 internal class ConfigFilesManager
5 {
6
7 #region 私有
8 /// <summary>
9 /// 配置接口
10 /// </summary>
11 IConfiger configer;
12 /// <summary>
13 /// 锁对象
14 /// </summary>
15 object lockHelper = new object ();
16
17 /// <summary>
18 /// 配置文件修改时间
19 /// </summary>
20 DateTime fileChangeTime;
21
22 /// <summary>
23 /// 配置文件所在路径
24 /// </summary>
25 string fileName = null ;
26
27 Type configType = null ;
28
29 #endregion
30
31 #region 属性
32
33 /// <summary>
34 /// 当前配置类的实例 接口
35 /// </summary>
36 internal IConfiger IconfigInfo
37 {
38 get { return configer; }
39 set { configer = value; }
40 }
41
42 /// <summary>
43 /// 配置文件所在路径
44 /// </summary>
45 internal string ConfigFilePath
46 {
47 get { return fileName; }
48
49 }
50
51 #endregion
52
53 #region 构造
54
55 /// <summary>
56 /// 初始化文件修改时间和对象实例
57 /// </summary>
58 internal ConfigFilesManager( string fileName, Type type)
59 {
60 this .fileName = fileName;
61 // 得到配置文件的 改时间
62 this .configType = type;
63 fileChangeTime = File.GetLastWriteTime( this .fileName);
64 this .configer = ConfigSerialize.DeserializeInfo( this .fileName, this .configType);
65 }
66
67 #endregion
68
69 #region 配置操作
70
71 #region 加载配置类
72 /// <summary>
73 /// 加载配置类
74 /// </summary>
75 /// <returns></returns>
76 internal IConfiger LoadConfig()
77 {
78 return IconfigInfo as IConfiger;
79 }
80 #endregion
81
82 #region 重设配置类实例
83 /// <summary>
84 /// 重设配置类实例
85 /// </summary>
86 /// <returns></returns>
87 internal IConfiger LoadRealConfig()
88 {
89 lock (lockHelper)
90 {
91 DateTime newfileChangeTime = File.GetLastWriteTime( this .fileName);
92 if (!newfileChangeTime.Equals( this .fileChangeTime))
93 {
94 IconfigInfo = ConfigSerialize.DeserializeInfo(ConfigFilePath, this .configType);
95 this .fileChangeTime = newfileChangeTime;
96 }
97 }
98 return IconfigInfo as IConfiger;
99 }
100 #endregion
101
102 #region 保存配置
103 /// <summary>
104 /// 保存配置
105 /// </summary>
106 /// <returns></returns>
107 internal bool SaveConfig()
108 {
109 lock (lockHelper)
110 {
111 return ConfigSerialize.Serializer(ConfigFilePath, IconfigInfo);
112 }
113 }
114 #endregion
115
116 #endregion
117
118 }
ConfigSerialize它是一个配置文件序列化和反序列化的功能类,它返回的对象必须是继承自IConfiger接口的对象
1 /// <summary>
2 /// 配置序列化操作类
3 /// </summary>
4 internal class ConfigSerialize
5 {
6 #region 反序列化指定的类
7
8 /// <summary>
9 /// 反序列化指定的类
10 /// </summary>
11 /// <param name="configfilepath"> config 文件的路径 </param>
12 /// <param name="configtype"> 相应的类型 </param>
13 /// <returns></returns>
14 public static IConfiger DeserializeInfo( string path, Type type)
15 {
16
17 IConfiger iconfiginfo;
18 FileStream fs = null ;
19 try
20 {
21 fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
22 XmlSerializer serializer = new XmlSerializer(type);
23 iconfiginfo = (IConfiger)serializer.Deserialize(fs);
24 }
25 catch (Exception ex)
26 {
27 throw ex;
28 }
29 finally
30 {
31 if (fs != null )
32 {
33 fs.Close();
34 }
35 }
36
37 return iconfiginfo;
38 }
39
40
41
42 #endregion
43
44 #region 保存(序列化)指定路径下的配置文件
45
46 /// <summary>
47 /// 保存(序列化)指定路径下的配置文件
48 /// </summary>
49 /// <param name="configFilePath"> 指定的配置文件所在的路径(包括文件名) </param>
50 /// <param name="configinfo"> 被保存(序列化)的对象 </param>
51 /// <returns></returns>
52 public static bool Serializer( string path, IConfiger Iconfiginfo)
53 {
54 bool succeed = false ;
55 FileStream fs = null ;
56 XmlSerializer serializer = null ;
57 try
58 {
59 fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
60 serializer = new XmlSerializer(Iconfiginfo.GetType());
61 serializer.Serialize(fs, Iconfiginfo);
62 // 成功则将会返回true
63 succeed = true ;
64 }
65 catch (Exception ex)
66 {
67 throw ex;
68 }
69 finally
70 {
71 if (fs != null )
72 {
73 fs.Close();
74 serializer = null ;
75 }
76 }
77
78 return succeed;
79 }
80
81 #endregion
82
83 }
IConfiger它是配置信息实体的统一接口,它提供了统一的配置信息操作返回类型,在读取具体配置信息时,只要类型强转换就可以了。
1 namespace ConfigCache
2 {
3 using System;
4 /// <summary>
5 /// 配置信息类接口
6 /// </summary>
7 public interface IConfiger { }
8 }
可能有些园友会问,那配置信息的实体呢及配置信息的文件呢?
我要告诉您的是, 这些信息是与应用领域相关的,所以不在这个项目中呈现 ,它要应用到具体的领域项目中,就像这样:
在每一个领域解决方案的WEB项目中,都有一个Configs文件夹,我们的配置信息文件和实体都在这里显示,它们是成对出现的,如WebConfig.cs它是一个网站信息配置的实体,而对应的WebConfig.Config就是它对应的配置信息文件,它们的代码如下:
1 namespace TEstMv3.Config
2 {
3 public class WebConfig : IConfiger
4 {
5 public string PageSize { get ; set ; }
6 public string CategoryID { get ; set ; }
7 }
8 }
webconfig.config是一个XML标准的文件:
1 <?xml version= " 1.0 " encoding= " utf-8 " ?> 2 <WebConfig> 3 <PageSize> 10 </PageSize> 4 <CategoryID> 2 </CategoryID> 5 </WebConfig>
其中<WebConfig>是实体文件的类名,这个要注意一下。
调用用时,可以这样:
1 new ConfigCache.ConfigFactory().GetConfig<WebConfig>().PageSize;
好了,事实上现在我们就可以工作了,而对于怎么去提升配置文件读取的性能,我会另外写一篇文件的,介请收看。
分类: 面向服务 , 系统架构
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息