zoukankan      html  css  js  c++  java
  • .net2.0中配置文件操作的深入探讨.

    开通了blog这么长时间,一直没来写篇文章,原因是实在太忙.…(其实也是有点偷懒).最近在开发CSDN新社区的过程中遇到了一个与配置文件操作有关的问题,觉得比较有代表性,干脆就以此为主题,作为我的第一篇文章好了:)

    需求很简单,我们需要一个XML形式的配置文件,记录了单个论坛的配置信息,现在我们就需要一个解决方案来方便的对配置信息进行存取.

    脑子几乎没多想,立刻想到了使用类的序列化方式来实现.实际正是如此,很快,我的代码按我的想法就出来了.
    一个RoomConfig类,包含room的基本信息,既有基础数据类型,也有对象在里面.代码片段如下:
            members

            
    public properties

    接下来定义一个ConfigManager.把存取操作的细节封装.
    部分代码如下:
    public class ConfigManager
        
    {
            
    make config

            
    get config
        }


    这样,就完成了需求,过程非常轻松.但,很快,我就从蝈蝈那里得到了新需求:必须使用,net2.0的推荐的方式对配置文件进行操作.参考了他的文章:http://blog.joycode.com/ghj/archive/2006/02/11/71309.aspx

    本以为按着例子写一遍OK了,但实际上由于这里的配置对象包含子对象,直接用类似
    config.Sections.Add("SettingsData", configData);
    config.Save();
    的方式立刻出错了,无法把对象和string进行转换.
    然后试了许多方法,总是没法解决这个问题,现在想起来,始终是我把问题想的过于简单,这里面,需要额外做的工作还很多.
    首先把RoomConfig从ConfigurationSection继承,顾名思义,这是表示一个section,里面还包含子对象;
    在此处,我们包含了一个OpWithOneTemplate对象,我们对这个类也需要做额外的事.
    把它从 ConfigurationElement继承,其实这种关系很明显,是section的单个对象.类里面的操作,与RoomConfig的属性操作大同小异,可以参照上面提到的蝈蝈的文章.
    如果你的子对象包含的都是基础数据类型,那OK,到这一步,就算完成了,但偏偏在这里OpWithOneTemplate还包含子对象,并且那个子对象还是个集合类型!
    又郁闷了一阵子,跟蝈蝈大哥讨论了这个问题.得出的结论是查资料.期间,我们参考了企业库的做法和http://blogs.conchango.com/pauloreichert/archive/2005/05/31/1514.aspx 这篇文章.虽然获得了许多启发,但依然没有解决问题.
    郁闷的下班回去思考,最后换了一个思路终于解决了这个问题.集合的呈现,问题就在于无法自动的给你生成列表(实际上后来证明是可以的),那么我就给集合类增加一个专门用于写入配置文件的属性,这个属性代表了集合里的核心数据,并且通过它可以转换回数据集合.代码如下:(注,RoleList为OpWithOneTemplate包含的子类)

        [Serializable()]
        
    public class RoleList : ConfigurationElement
        
    {
            
    Private Static Variables

            
    members

            
    public properties

            
    construct

            
    methods
        }

    这样,终所有的配置类里的信息都可以在配置文件里呈现了.
    正当我兴冲冲跑来上班,要告诉蝈蝈我的解决方案时,蝈蝈却有了更好的解决方案,这里帮他介绍下,呵呵
    这种方法依然是严格依照.net推荐的方式进行,处理集合时,使用ConfigurationElementCollection,上面提到的RoleList从这个类派生,具体的集合对象再细化成一个类(上面的方法是直接把数据封存到list里面了)
    关键的地方还是RoleList,从ConfigurationElementCollection派生后,需要重写2个函数
    protected override ConfigurationElement CreateNewElement()
            
    {
                
    //throw new Exception("The method or operation is not implemented.");
                return new Role(RoleEnum.Administrator);
            }


            
    protected override object GetElementKey(ConfigurationElement element)
            
    {
                
    //throw new Exception("The method or operation is not implemented.");
                Role r = element as Role;
                
    if (r == null)
                    
    return "Administrator";
                
    else
                    
    return r.RoleName;
            }

    这样,在返回集合对象时,将按上面的函数来创建单个对象,这也就是为什么要把数据再进一步封到一个类里的原因,要不Create函数就没法返回了.
    Role类非常简单,如下:
        /// <summary>
        
    /// 只是单纯的把一个枚举封装起来,目的只是要使枚举值可被操作(从ConfigurationElement继承).
        
    /// </summary>

        public class Role : ConfigurationElement
        
    {
            
    public Role(RoleEnum e)
            
    {
                
    this["RoleName"= e;
            }


            [ConfigurationProperty(
    "RoleName")]
            
    public RoleEnum RoleName
            
    {
                
    get
                
    {
                    
    return (RoleEnum)this["RoleName"];
                }

                
    set
                
    {
                    
    this["RoleName"= value;
                }

            }

    到这里,3种配置文件存取的方法都介绍完了,写的很乱,也不知道对大家会不会有用,各取所需好了:)

    参考文献:
    http://blog.joycode.com/ghj/category/1257.aspx
    http://blogs.conchango.com/pauloreichert/archive/2005/05/31/1514.aspx

  • 相关阅读:
    最详解JavaScript常见的创建对象的七种方式(推荐)
    详解数组的迭代方法every()、filter()、forEach()、map()以及some()的用法
    详解数组的concat()、slice()、splice()方法
    解决微信小程序中web-view无法调用微信支付
    SQLAlchemy_定义(一对一/一对多/多对多)关系
    常用算法
    Python框架之Tornado (源码之褪去模板外衣)
    Python框架之Tornado(源码之褪去模板外衣的前戏)
    Python框架之Tornado(请求)
    Python框架之Tornado(请求阶段)
  • 原文地址:https://www.cnblogs.com/wuxilin/p/355687.html
Copyright © 2011-2022 走看看