首页 > 技术文章 > 使用泛型对读写配置文件的方法进行封装

New-world 2014-07-24 00:32 原文

一般一个站点会有多个配置文件,如果要针对每个配置文件进行读写,这是要疯的节奏

之前学泛型,一直没用到过,在这里练习一下,体会泛型实际对我们减少冗余代码的作用 

/// <summary>
    /// 站点配置文件的路径
    /// </summary>
    public class ConfigPath
    {
        /// <summary>
        /// 数据库配置文件
        /// </summary>
        public static readonly string DB = "/App_Data/DB.config";

        /// <summary>
        /// 站点配置文件
        /// </summary>
        public static readonly string WebSite = "/App_Data/WebSite.config";
    }

    /// <summary>
    /// 操作配置文件帮助类
    /// </summary>
    public class ConfigHelper
    {

        private static object lockHelper = new object();

        /// <summary>
        /// 加载配置文件
        /// </summary>
        /// <param name="configPath">配置文件相对路径</param>
        /// <param name="IsCache">是否使用缓存</param>
        /// <param name="cacheKey">如果使用了缓存,则缓存键为</param>
        /// <returns></returns>
        public static T LoadConfig<T>(string configPath, bool isCache, string cacheKey)
        {
            if (isCache)
            {
                T model = (T)CacheHelper.Get(cacheKey);
                if (model == null)
                {
                    model = (T)IOHelper.DeserializeFromXML(typeof(T), IOHelper.GetMapPath(configPath));
                    if (model != null)
                        CacheHelper.Insert(cacheKey, model,IOHelper.GetMapPath(configPath));
                }
                return model;
            }
            else
            {
                return (T)IOHelper.DeserializeFromXML(typeof(T), IOHelper.GetMapPath(configPath));
            }

        }

        /// <summary>
        /// 写入配置文件
        /// </summary>
        /// <param name="configPath">配置文件相对路径</param>
        /// <param name="obj">新的内容实体</param>
        /// <returns></returns>
        public static bool SaveConfig(string configPath,object obj)
        {
            var permissionSet = new PermissionSet(PermissionState.None);
            var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, IOHelper.GetMapPath(configPath));
            permissionSet.AddPermission(writePermission);

            if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
            {
                lock (lockHelper)
                {
                    IOHelper.SerializeToXml(obj,IOHelper.GetMapPath(configPath));
                }
                return true;
            }
            else
            {
                return false;//没有写入权限
            }
        }

    }

IOHelper类中序列化的两个方法:

#region  序列化

        /// <summary>
        /// XML序列化
        /// </summary>
        /// <param name="obj">序列对象</param>
        /// <param name="filePath">XML文件路径</param>
        /// <returns>是否成功</returns>
        public static bool SerializeToXml(object obj, string filePath)
        {
            bool result = false;

            FileStream fs = null;
            try
            {
                fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(fs, obj);
                result = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
            return result;

        }

        /// <summary>
        /// XML反序列化
        /// </summary>
        /// <param name="type">目标类型(Type类型)</param>
        /// <param name="filePath">XML文件路径</param>
        /// <returns>序列对象</returns>
        public static object DeserializeFromXML(Type type, string filePath)
        {
            FileStream fs = null;
            try
            {
                fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                XmlSerializer serializer = new XmlSerializer(type);
                return serializer.Deserialize(fs);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
        }

        #endregion

配置文件的xml:

<?xml version="1.0" encoding="utf-8"?>
<WebSite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SiteName>站点名称</SiteName>
  <SiteUrl>站点URL</SiteUrl>
  <ICP>备案信息</ICP>
  
</WebSite>

实体类:

/// <summary>
    /// 站点配置信息
    /// </summary>
    [Serializable]
    public class WebSite
    {
        /// <summary>
        /// 站点名称
        /// </summary>
        public string SiteName{get;set;}

        /// <summary>
        /// 站点URL
        /// </summary>
        public string SiteUrl { get; set; }

        /// <summary>
        /// 站点配置信息
        /// </summary>
        public string ICP { get; set; }
    }

 

调用:

/// <summary>
        /// 站点配置文件
        /// </summary>
        public Model.WebSite SiteConfig { get { return ConfigHelper.LoadConfig<Model.WebSite>(ConfigPath.WebSite, true, CacheKey.CACHE_SITECONFIG); } }

推荐阅读