话说小菜连打数个哈欠,趴在桌上就给睡着了.
开始又梦到Discuz!NT了.老大开始在骂小菜了,过了这么久还没有做好啊.赶快给我做好,不然炒了你,拿来配酒吃.

小菜不敢怠慢,连连说是.回到电脑前,伸伸懒腰,马上开工.
小菜先打开general.config通用配置文件看看究竟.


小菜梦游Discuz!NT (第四篇 配置文件处理3)<?xml version="1.0"?>
小菜梦游Discuz!NT (第四篇 配置文件处理3)
<GeneralConfigInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
小菜梦游Discuz!NT (第四篇 配置文件处理3)  
<ForumTitle>Discuz!NT</ForumTitle>
小菜梦游Discuz!NT (第四篇 配置文件处理3)  
<ForumUrl>forumindex.aspx</ForumUrl>
小菜梦游Discuz!NT (第四篇 配置文件处理3)  
<Closed>0</Closed>
小菜梦游Discuz!NT (第四篇 配置文件处理3)  
<CloseDreason>抱歉!论坛暂时关闭,稍后才能访问.</CloseDreason>
小菜梦游Discuz!NT (第四篇 配置文件处理3)  
<RegStatus>1</RegStatus>
小菜梦游Discuz!NT (第四篇 配置文件处理3)
</GeneralConfigInfo>
后之前的DNT.config类似
1)都是XML文件
2)ForumTitle : 论坛名称
   ForumUrl : 论坛首页名称
   Closed : 论坛关闭 (0为开启 1为关闭)
   CloseDreason : 论坛关闭时提示信息
   RegStatus : 允许新用户注册 (0不允许 1允许)

按照之前的设计思路,小菜直接就想到了为其定义一个GeneralConfigInfo通用配置文件描述类
然后定义一个GeneralConfigFileManager通用配置文件管理类来管理它
小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}

接着定义GeneralConfigFileManager设计类似BaseConfigFileManager.
小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.IO;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Web;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Xml.Serialization;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}

测试Response.Write(Discuz.Config.GeneralConfigFileManager.GetForumTitle);
输出: Discuz!NT
将general.config配置文件中的<ForumTitle>Discuz!NT</ForumTitle>结点的值修改为 小菜论坛
刷新,立马看到 小菜论坛

接下来还有urls.config ,spread.config等等一大堆,Ctrl+C,Ctrl+V可不是好主意,因为重复的代码太多了.
虽然小菜有点菜,但是小菜立志向上发展.所以坚决不做代码工人.
小菜要做工匠.所以觉得应该第二次重构下代码
前一次重构是在 小菜梦游Discuz!NT (第三篇 配置文件处理2)  修理代码.BaseConfigFileManager

重构: BaseConfigFileManager与GeneralConfigFileManager代码重复太多,接下来还有UrlsConfigFileManager重复将更多.所以小菜决定为他们定义一个基类DefaultConfigFileManager
    1)DeserializeInfo()函数首当其冲,几乎完全一样.要想改造它,除非BaseConfigInfo与GeneralConfigInfo有共同的基类
       或接口,小菜决定定义一个空接口IConfigInfo然后让BaseConfigInfo与GeneralConfigInfo实现它.
小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config

小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}

小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}

        
小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.IO;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Xml.Serialization;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
这样我们在派生类BaseConfigFileManager与GeneralConfigFileManager中只需将配置文件路径与序列化类型传给基类的DeserializeInfo(string configFilePath, Type configType)便可.

改造后的代码为
小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.IO;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Web;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Xml.Serialization;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}

小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.IO;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Web;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Xml.Serialization;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}

小菜就这样构造出了EmailConfigFileManager等等配置文件的管理.....
代码给老大过目..
老大说:恩不错,不过还漏了一个功能啊.修改配置文件啊.
小菜说,为何要修改配置文件呢?可以直接打开配置文件修改了...
老大接着说:打开配置文件修改...噢,,天呐..这是一件多么麻烦的事...我们的用户可是会抱怨的...让他们对着那么多不知所云的配置文件.还要让他们修改....这几乎不太可能.

所以小菜啊,你得加上这个功能.我们的Web层小组会定制具有亲和力的界面来帮助用户方便的修改配置文件...
小菜梦游Discuz!NT (第四篇 配置文件处理3)
     这个界面怎么样,不错吧,,,比起直接修改配置文件要强很多吧...不过它们最终得依靠你提供的修改配置文件功能.

小菜听了老大这一番话后,马上回去修改代码..
毕竟小菜已经重构过代码了,现在添加功能已经容易很多.
在基类DefaultConfigFileManager中添加SaveConfig,派生类便可直接使用.
小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.IO;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Xml.Serialization;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config


小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.IO;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Web;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using System.Xml.Serialization;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}
BaseConfigFileManager当然也就和GeneralConfigFileManager类似了.
现在就让我们来测试一下.
我们修改打算修改general.config配置文件的论坛名称.从 Discuz!NT 修改为  小菜论坛 .
1)第一步.
先测试一下,论坛名称是什么.Response.Write("论坛名称:" + GeneralConfigFileManager.GetForumTitle);
输出:Discuz!NT
2)第二步.
修改论坛名称.

小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
using Discuz.Config;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
public partial class forumindex : System.Web.UI.Page
}


程序输出:是否修改配置成功:True,论坛名称:Discuz!NT
奇怪了.修改成功.论坛名字为什么还是Discuz!NT而不是小菜论坛
到general.config中看一下
小菜梦游Discuz!NT (第四篇 配置文件处理3)
已经修改过来了,而且是还很正常.为小菜论坛 .

而且程序抛出了异常(XML文档0,0中有错误.奇怪了.general.config明明很正常)...这是为什么呢?
小菜梦游Discuz!NT (第四篇 配置文件处理3)

小菜决定把这个异常注释掉看看程序是否会照常运行.
//throw ex;
把general.config中的论坛名称重新改为Discuz!NT
运行.
程序输出:是否修改配置成功:True,论坛名称:Discuz!NT
刷新后
程序输出:是否修改配置成功:True,论坛名称:小菜论坛
一切正常.....小菜也不知道那个异常到底是为什么?希望高人指点.

这里谢谢@zahota : 小菜将DefaultConfigFileManager中的SaveConfig方法中的
fs = new FileStream(configFilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
修改为
fs = new FileStream(configFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
就没有问题了,可以把上面的 //throw ex; 注释放心的去掉了.

原因是小菜也说不清楚,还是不说好,大家可以看下SDK2.0

快接近尾声了.
让我们来看看还有哪些不足.
很明显,我们修改论坛名时的代码
GeneralConfigInfo configInfo = new GeneralConfigInfo();
configInfo.ForumTitle = "小菜论坛";
configInfo.ForumUrl = "forumindex.aspx"; //我们不想要
configInfo.Closed = 0; //我们不想要
configInfo.CloseDreason = "抱歉!论坛暂时关闭,稍后才能访问."; //我们不想要
configInfo.RegStatus = 1; //我们不想要

除了一二两句,其它我们并不想要.因为我们只是想修改论坛名称而已.
但是不要又会出错,因为序列化的XML文件不完整.
怎么办呢?很简单.在GeneralConfigInfo代码中.为私有成员初始化便可.

小菜梦游Discuz!NT (第四篇 配置文件处理3)using System;
小菜梦游Discuz!NT (第四篇 配置文件处理3)
小菜梦游Discuz!NT (第四篇 配置文件处理3)
namespace Discuz.Config
}
好了,这到这里,,,休息...休息

小菜梦游Discuz!NT配置文件处理部份完成,源代码:https://files.cnblogs.com/a-peng/newbie_config.rar

相关文章:

  • 2022-12-23
  • 2021-06-13
  • 2021-11-10
  • 2022-12-23
  • 2021-11-03
  • 2022-12-23
  • 2021-08-25
  • 2021-07-01
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案