博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
配置文件项目学习分享
阅读量:4566 次
发布时间:2019-06-08

本文共 5847 字,大约阅读时间需要 19 分钟。

           建设一个对配置文件方便快捷操作的项目,是一个项目重要的建设模块之一,项目中很多方法都需要调用配置文件中的配置信息进行后续操作。以下是DNT发布包中的配置文件信息。

  

    其实道理也很简单,就是将实体对象的状态序列化并且写入到配置文件中。需要用到的时候读取出配置文件反序列化成对象即可。但是也要考虑到一些因素,比如配置文件是否存在,配置文件最初的配置呈现,配置文件的保存路径,等等,这就需要我们自己对代码进行加工了。

    config文件为XML格式文档,当然对其操作也少不了对其相关类的引用了。

using System.Xml;    using System.Xml.Serialization;

     本项目内容不多,言简意赅,分为两部分,一是加载数据,二是保存(更新)数据。  

    加载数据:这里的加载数据,即将配置文件中的数据反序列化成对象,返回对象,方便开发人员对配置文件对象进行配置。为了方便公用,将其写作泛型方法。

1         ///  2         /// 获取配置信息 3         ///  4         /// 
配置信息类
5 ///
6 public static T GetConfig
() where T : class, new() 7 { 8 string configFilePath = GetConfigFilePath
(); 9 return (T)DeserializeInfo
(configFilePath, typeof(T));10 }

                GetConfigFilePath方法 为获得配置文件路径,通常存放于根目录的Config文件夹中,也可对此方法进行修改,完成对配置文件存放目录的指定。

获得文件所在路径
1         ///  2         /// 获得文件所在路径 3         ///  4         /// 
配置信息类
5 ///
6 public static string GetConfigFilePath
() 7 { 8 string path = System.Web.HttpContext.Current.Server.MapPath("~/Config/"); 9 return path + typeof(T).Name + (".config");10 }

                DeserializeInfo方法 是指定目录的配置文件进行反序列化成对象。

将配置文件反序列化成对象
1         #region 反序列化指定的类 + static IConfigInfo DeserializeInfo(string configFilePath, Type configType) 2         ///  3         /// 反序列化指定的类 4         ///  5         /// config文件的路径 6         /// 指定的类型 7         /// 
8 public static T DeserializeInfo
(string configFilePath, Type configType) where T : class,new() 9 {10 string configChacheKey = "CK_SiteConfigCode_" + configType.Name; 11 T configinfo = SiteCache.Get
(configChacheKey); 12 13 if (configinfo == null)14 {15 if (IsGenner(configFilePath, (T)Activator.CreateInstance(configType)) == false) //判断是否有文件,没有则生成16 {17 using (XmlTextReader xmlTextReader = new XmlTextReader(configFilePath))18 {19 XmlSerializer xmlSerializer = new XmlSerializer(configType);20 configinfo = (T)xmlSerializer.Deserialize(xmlTextReader);21 }22 }23 else24 {25 configinfo = new T();26 }27 SiteCache.Get
(configChacheKey, () => configinfo, new CacheDependency(configFilePath));28 }29 return configinfo;30 }31 #endregion

              在DeserializeInfo方法中,有一段是用来判断是否存在配置文件的方法,如果存在,则直接反序列化成对象,然后返回给GetConfig方法中。如果不存在配置文件,则自动生成配置文件,即 IsGenner方法 。考虑到不断反序列化影响性能,将对象加入到缓存。

      

1        #region 是否存在配置文件(没有则生成) + static bool IsGenner
(string configFilePath, T configInfo) 2 ///
3 /// 判断是否存在配置文件(没有则生成) 4 /// 5 ///
配置文件路径 6 ///
临时配置变量 7 ///
8 public static bool IsGenner
(string configFilePath, T configInfo) 9 {10 string directoryPath = System.Web.HttpContext.Current.Server.MapPath("/Config");11 12 if (!Directory.Exists(directoryPath))13 {14 Directory.CreateDirectory(directoryPath);15 }16 17 FileInfo fileInfo = new FileInfo(configFilePath);18 if (!System.IO.File.Exists(configFilePath) || fileInfo.Length == 0)19 {20 if (configInfo == null)21 {22 return false;23 }24 using (FileStream fs = new FileStream(configFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))25 {26 XmlSerializer xml = new XmlSerializer(configInfo.GetType());27 xml.Serialize(fs, configInfo);28 }29 return true;30 }31 return false;32 }33 #endregion

    如果不存在配置文件,生成后,直接new 一个对象返回给GetConfig()方法。同时也跳过序列化数据这段代码,在这里,第一部分加载数据就这样了。

           保存(更新)配置文件:传入一个实例对象,对实例对象进行序列化,并将内容进行写入到配置文件中,达到更新配置文件信息的效果。

          

1    #region 保存(序列化)指定路径下的配置文件 + public static bool SaveConfig
(string configFilePath, T configInfo) 2 ///
3 ///保存(序列化)指定目录下文件的配置信息 4 /// 5 ///
配置信息类
6 ///
配置信息文件路径 7 ///
配置信息 8 ///
9 public static void SaveConfig
(string configFilePath, T configInfo)10 {11 Type configType = typeof(T);12 13 if (IsGenner(configFilePath, configInfo) == false)14 {15 try16 {17 XmlSerializer xmlSerializer = new XmlSerializer(configType);18 using (XmlTextWriter xmlTextWriter = new XmlTextWriter(configFilePath, Encoding.UTF8))19 {20 xmlTextWriter.Formatting = Formatting.Indented;21 XmlSerializerNamespaces xmlNamespace = new XmlSerializerNamespaces();22 xmlNamespace.Add(string.Empty, string.Empty);23 xmlSerializer.Serialize(xmlTextWriter, configInfo, xmlNamespace);24 }25 }26 catch (SecurityException ex)27 {28 throw new SecurityException(ex.Message, ex.DenySetInstance, ex.PermitOnlySetInstance, ex.Method, ex.Demanded, (IPermission)ex.FirstPermissionThatFailed);29 }30 }31 }32 #endregion

       所有的配置信息实体类,继承于这个配置信息操作基类即可。

 

 

 

 

 

转载于:https://www.cnblogs.com/yangda/archive/2013/03/03/2941822.html

你可能感兴趣的文章
redis列表list
查看>>
雷林鹏分享: C# 简介
查看>>
ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法
查看>>
实用类-<Math类常用>
查看>>
构建之法阅读笔记之四
查看>>
10.15习题2
查看>>
Windows Server 2008 R2 备份与恢复详细实例
查看>>
Ubuntu上kubeadm安装Kubernetes集群
查看>>
关于java学习中的一些易错点(基础篇)
查看>>
MFC的多国语言界面的实现
查看>>
四则运算个人项目 最终版
查看>>
java线程系列---java5中的线程池
查看>>
SQL表连接
查看>>
新秀系列C/C++经典问题(四)
查看>>
memset函数具体说明
查看>>
经常使用的android弹出对话框
查看>>
确保新站自身站点设计的合理性的六大注意点
查看>>
promise
查看>>
Go 网络编程笔记
查看>>
[]Java面试题123道
查看>>