使用泛型对读写配置文件的方法进行封装

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

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

/// <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); } }

使用泛型对读写配置文件的方法进行封装,布布扣,bubuko.com

时间: 2024-10-11 22:25:35

使用泛型对读写配置文件的方法进行封装的相关文章

Java读写配置文件——Properties类的简要使用笔记

任何编程语言都有自己的读写配置文件的方法和格式,Java也不例外. 在Java编程语言中读写资源文件最重要的类是Properties,功能大致如下: 1. 读写Properties文件 2. 读写XML文件 3. 不仅可以读写上述两类文件,还可以读写其它格式文件如txt等,只要符合key=value格式即可. 注意:资源文件中含有中文时的处理方法 1. 将中文字符通过工作转成utf8编码,可以通过Java自带的nativetoascii或Eclipse中的属性编辑器. 2. 直接调用 new S

asp.net读写配置文件方法

方法1: System.Collections.Specialized.NameValueCollection nvc = (System.Collections.Specialized.NameValueCollection) System.Configuration.ConfigurationManager.GetSection(sectionName); string keyValue = nvc.GetValues(keyName)[0].ToString(); 方法2: System.

python-ConfigParser模块【读写配置文件】

http://www.codesky.net/article/201003/122500.html http://www.linuxso.com/linuxbiancheng/8987.html 以下的文章就是对Python 读写配置文件的具体方案的介绍 1,函数介绍 1.1.读取配置文件 -read(filename) 直接读取ini文件内容-sections() 得到所有的section,并以列表的形式返回-options(section) 得到该section的所有option-items

ConfigParser 读写配置文件

一.ini: 1..ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式 2.ini文件创建方法: (1)先建立一个记事本文件.(2)工具 - 文件夹选项 - 查看 - 去掉"隐藏已知文件的扩展名"前面的√.这样一来,你建立的那个记事本的扩展名就显示出来了"*.txt".然后,你把这个.txt扩展名更改为.ini 3.ini文件的格式: (1)节:section 节用方括号括起来,单独占一行,例如:

ClassLoader.getResourceAsStream(name); 获取配置文件的方法

ClassLoader.getResourceAsStream(name);路径问题 InputStream in = getClass().getResourceAsStream('/'+"spring-beans.dtd"); 表示从classs目录下面的找文件,文件放在src下面就可以了.InputStream in = getClass().getResourceAsStream("spring-beans.dtd"); 表示从当前classs下面的路径找文

Linux在应用层读写寄存器的方法

今天有同学去百度,带回一道面试题,和大家分享一下: 打印: n=1 1 n=2 3 3 2 4 1 1 4 5 5 n=3 7 7 7 7 6 8 3 3 2 6 8 4 1 1 6 8 4 5 5 5 8 9 9 9 9 提供一段参考程序: <pre name="code" class="cpp">// ConsoleApplication1.cpp: 主项目文件. #include "stdafx.h" #include &quo

使用ConfigurationManager类读写配置文件

使用ConfigurationManager类 读写配置文件app.config,以下为代码: view plaincopy to clipboard print? using System; using System.Configuration; static class Program { static void Main() { showConfig(); UpdateAppSettings(); showConfig(); Console.ReadKey(true); } private

Sql Server Always On 读写分离配置方法

使用了Sqlserver 2012 Always on技术后,假如采用的配置是默认配置,会出现Primary server CPU很高的情况发生,比如默认配置如下: 需要自定义来解决这个问题. 我们先来看看上图中的这些选项的意义 主角色中的连接 允许所有连接 如果当前server是primary角色时,primary instance允许所有连接(如:读/写/管理) 允许读/写连接 如果当前server是primary角色时,primary instance只允许读/写连接(如果通过ssms连接

实现快速读写配置文件的内容,可以用于读取*.exe.config文件或者Web.Config文件的内容,或者可以读取指定文件的配置项.

形如: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microso