接触了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());}}elsem_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();}}

转载于:https://www.cnblogs.com/kmsfan/p/5241428.html

Discuz NT 架构剖析之Config机制相关推荐

  1. Discuz!NT 缓存设计简析 [原创]

    作为一个社区类型软件,大并发支持和高效稳定运行永远是"硬道理",而有效安全的使用 缓存恰恰能起到事倍功半的效果.而.NET本身所提供的缓存机制又显得过于"单薄" ...

  2. Discuz!NT 模板机制分析(转)

    作为产品中的一大特色,模板机制一经推出,就引来了大家特别是站长们的关注.但它所饱受的风风 雨雨也成了那时不少人关注的话题.而今天本人将结合在产品组中的开发经历,介绍一下模板机制在设计 使用时的一些体会 ...

  3. Discuz!NT控件剖析 之 Button [原创: 附源码]

      Discuz!NT控件剖析 之 Button [原创: 附源码] 收藏 在开源之后,还没什么文章来说明 Discuz!NT项目的一些特点.作为这个控件库的设计者,本人将在接下来的时间里用连载的方式 ...

  4. Android 安全架构及权限控制机制剖析

    简介: Android 是业界流行的开源移动平台,受到广泛关注并为多个手机制造商作为手机的操作系统平台,因此,研究其安全架构及权限控制机制具有非常的重要性.本文从 Android 层次化安全架构入手, ...

  5. Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]

    自从 9月未开始写关于"ICONIX方法"的系列文章以来,到今天已有两个多月了,当初因为兴趣点的转移才划一 段落的Discuz!NT 系列文章,从今天开始又要开始续写了.这写这个系 ...

  6. Discuz!NT 中的数据库链接类(重构到抽象类工厂模式)

       在7月份中我曾经写过一篇随笔叫,叫" .NET2.0 框架中的 AbstractFactory 模式 " . 里面主要说了在2.0框架下的数据库链接工厂中新增的几个类,而这几 ...

  7. Discuz!NT负载均衡方案

    在前面的几篇文章中,主要谈到了在Discuz!NT中的跨站缓存数据,数据库负载均衡.但如果要实现将产品分布式布置到若干机器,组成集群来共同支撑起整个业务的话,还是有一定问题的(后面会有所介绍).下面先 ...

  8. Discuz!NT数据库读写分离方案

    目前在Discuz!NT这个产品中,数据库作为数据持久化工具,必定在并发访问频繁且负载压力较大的情况下成 为系统性能的'瓶颈'.即使使用本地缓存等方式来解决频繁访问数据库的问题,但仍旧会有大量的并发请 ...

  9. Discuz!NT 在线用户功能简介

    声明:本文内容纯属个人观点,官方保留最终解释 在上文(Discuz!NT URL地址重写) 中, 聊到了"在线用户"功能,因为当时介绍的重点不是"在线" 那一块 ...

最新文章

  1. source insight设置tab键为4个空格
  2. 九十七、轻松搞定Python中的PDF办公自动化系列
  3. mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
  4. python缩进注意事项_python注意事项
  5. ICCV 2019 | 微软开源无监督学习的医学图像配准方法:递归级联网络
  6. 一个小例子搞懂redux的套路
  7. 【nexus】nexus 仓库组的概念 以及相关配置 代码发布相关
  8. 内网访问已经启动的vue项目
  9. XMLHttpReq.onreadystatechange 传递参数
  10. 系统集成项目管理工程师-历年真题分析与解答 Android版
  11. 易语言解析html实例,易语言总使用正则表达式实例解析
  12. UI设计师必备技能——点击进入的网页设计全攻略
  13. Laravel单元测试
  14. 13.敏捷组织转型四步法之3 - 通过MoMoKo模型推进业务敏捷
  15. 程序猿面试八股文分享~
  16. c莫比乌斯函数_莫比乌斯函数
  17. javascript基础常识问答(三)
  18. 救救小王吧:如何快速解决图像相似性检测问题?
  19. 7-1 厘米换算英尺英寸(15 分)
  20. 单片机c语言波特率检测,基于MSP430系列微控制器串口通信时的波特率自动检测的实现...

热门文章

  1. 努力成为优秀的工程师
  2. jbpm知识点——tasknode
  3. mysql不能改路径到d盘_Windows Server 2008 R2修改MySQL 5.5数据库目录为D盘示例
  4. python中for语句可以有else部分_Python中的for...else语句可以不写else吗?
  5. eclipse字体大小设置_Java 设置Excel单元格格式—基于Spire.Cloud.SDK for Java
  6. 大学计算机信息技术一级考题,大学计算机信息技术一级试题新.pdf
  7. CF570D Tree Requests
  8. 线段树 ---- 2021牛客多校第一场 J Journey among Railway Stations [线段树维护区间可行性判断]
  9. 计算机控制系统在农业上的应用研究,智能控制仪表系统在农业电气自动化中的应用研究...
  10. easypoi必填项_GitHub - wangjingting/poi-utils: help you more easy read or write excel file