接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈。

  首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里面,一部分信息存储在数据库里面。

这些信息都是在后台进行配置的信息,比如论坛的基础信息,不同的CONFIG文件,有不同的组合方式。那么你可能会问,这些CONFIG文件是怎么被取到的呢?

在Discuz.Config里面有相应的介绍,我们打开一个名为APIConfig的类

    public class APIConfigs
{
/// <summary>
/// 获取配置类实例
/// </summary>
/// <returns></returns>
public static APIConfigInfo GetConfig()
{
return APIConfigFileManager.LoadConfig();
} /// <summary>
/// 保存配置类实例
/// </summary>
/// <returns></returns>
public static bool SaveConfig(APIConfigInfo apiconfiginfo)
{
APIConfigFileManager acfm = new APIConfigFileManager();
APIConfigFileManager.ConfigInfo = apiconfiginfo;
return acfm.SaveConfig();
}
}

其中的GetConfig()方法是调用了另一个静态方法:APIConfigFileManager.LoadConfig()

        /// <summary>
/// 返回配置类实例
/// </summary>
/// <returns></returns>
public static APIConfigInfo LoadConfig()
{
ConfigInfo = DefaultConfigFileManager.LoadConfig(ref m_fileoldchange, ConfigFilePath, ConfigInfo);
return ConfigInfo as APIConfigInfo;
}

可以发现,其实是调用了 DefaultConfigFileManager.LoadConfig方法

其中LoadConfig方法是通过代入如下参数或者方法

1.文件加载时间

2.文件物理路径

3.判断是否检查更新文件加载时间变量

4.如果我们代入了一个对象,那么这个对象必定有它的类型,通过反射我们可以获取它的类型

在Discuz.Config中,我们所做的工作都是为了把加载的配置文件反序列化成我们需要的对象。

如果checkTime为true的时候,首先会检查一下文件的最后写入时间,然后用代入的时间和这个时间对比,如果2者不相等,就会把以最后写入时间为准。

m_lockHelper的作用是为了防止多个管理员同时调用这个方法造成的结果不固定;如果谁先调用了这个方法,那么直到这个方法调用结束以前其他人无法进入此线程。

        protected static IConfigInfo LoadConfig(ref DateTime fileoldchange, string configFilePath, IConfigInfo configinfo, bool checkTime)
{
lock (m_lockHelper)
{
m_configfilepath = configFilePath;
m_configinfo = configinfo; if (checkTime)
{
DateTime m_filenewchange = System.IO.File.GetLastWriteTime(configFilePath); //当程序运行中config文件发生变化时则对config重新赋值
if (fileoldchange != m_filenewchange)
{
fileoldchange = m_filenewchange;
m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType());
}
}
else
m_configinfo = DeserializeInfo(configFilePath, configinfo.GetType()); return m_configinfo;
}
}

DeserilizeInfo可以反序列化指定类型,从细节上来说,返回一个IConfigInfo可以让我们尝试转换变得更加的简单。Load中的FileStream只是用来读取图片流而已,且基于.Net Framework实现的。XmlSerializer可以处理不同Type的实现,并支持文件流的序列化。

        /// <summary>
/// 反序列化指定的类
/// </summary>
/// <param name="configfilepath">config 文件的路径</param>
/// <param name="configtype">相应的类型</param>
/// <returns></returns>
public static IConfigInfo DeserializeInfo(string configfilepath, Type configtype)
{
return (IConfigInfo)SerializationHelper.Load(configtype, configfilepath);
} /// <summary>
/// 反序列化
/// </summary>
/// <param name="type">对象类型</param>
/// <param name="filename">文件路径</param>
/// <returns></returns>
public static object Load(Type type, string filename)
{
FileStream fs = null;
try
{
// open the stream...
fs = new FileStream(filename, 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();
}
}

Discuz NT 架构剖析之Config机制的更多相关文章

  1. Discuz!NT中的Redis架构设计

    在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...

  2. Discuz!NT静态文件缓存(SQUID)

    在目前最新版本的产品中,我们提供了缓存静态文件的解决方案,就是使用SQUID做静态前端,将论坛中的大部分静态文件布署或外链到一个新的HTTP链接上,其中可以外链的静态文件包括:      1.Disc ...

  3. Discuz!NT中集成Memcached分布式缓存

    大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了 ...

  4. SQLServer内核架构剖析 (转载)

    SQL Server内核架构剖析 (转载) 这篇文章在我电脑里好长时间了,今天不小心给翻出来了,觉得写得很不错,因此贴出来共享. 不得不承认的是,一个优秀的软件是一步一步脚踏实地积累起来的,众多优秀的 ...

  5. 对于Discuz!NT不允许新用户注册的解决办法

    客户论坛用的是Discuz!NT,但是用户注册总是提示不允许新用户注册,对于这个问题,网上好多说的是管理员登录后台,在"用户与访问控制"里将允许新用户注册改为"是&quo ...

  6. Discuz!NT 3.9.913 Beta DIY过程

    前提: 论坛的源码版本为dnt_3.9.913_sqlserver_beta.zip,以下例子都以这个版本为原型修改 dnt_3.9.913数据字典:下载 目前(2013年10月21日)官网的asp. ...

  7. [转]分布式文件系统FastDFS架构剖析

    [转]分布式文件系统FastDFS架构剖析 http://www.programmer.com.cn/4380/ 文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实 ...

  8. Discuz!NT 后台任意文件上传的源代码修补方法

    相关的漏洞介绍: http://www.wooyun.org/bugs/wooyun-2013-035199 Discuz!NT 管理后台可以自定义文件类型,从而造成任意文件上传,测试过程中 aspx ...

  9. Discuz!nt整合心得

    最近研究了下Discuz!nt的整合,因为是网上找的实例,有个地方的写错了,导致纠结了一整天,这里分享出来. Discuz!nt提供了整合工具DiscuzToolkit,用于调用Discuz!nt A ...

随机推荐

  1. [高并发]Java高并发编程系列开山篇--线程实现

    Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...

  2. 用php做注册审核

    做注册审核就像前面讲的注册登录一样,也是要连接数据库 首先在数据库内要做这样一张表: 表名为users表 里面的列名分别为用户名,密码,姓名,性别,生日,账户的状态,照片 然后就可以写代码了,要注册的 ...

  3. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  4. Android性能优化之利用LeakCanary检测内存泄漏及解决办法

    前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...

  5. 【知识必备】一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~

    一.写在前面 其实博主在之前已经对design包的各个控件都做了博文说明,无奈个人觉得理解不够深入,所以有了这篇更加深入的介绍,希望各位看官拍砖~ 二.从是什么开始 1.首先我们得知道Coordina ...

  6. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  7. 负载均衡——nginx理论

     nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势.  nginx架构? ...

  8. 微信小程序监控 - HotApp统计

    HotApp小程序统计,第一个专业的微信第三方小程序监控统计工具 1.什么是HotApp小程序统计 HotApp小程序统计是第一个微信第三方小程序统计工具,就像做android 和 ios开发的人知道 ...

  9. Oracle补全日志(Supplemental logging)

    Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...

  10. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...