关闭页面特效

Discuz NT 架构剖析之Config机制

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

 


__EOF__

作  者ღKawaii
出  处https://www.cnblogs.com/kmsfan/p/5241428.html
关于博主:一个普通的小码农,为了梦想奋斗
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   yangliwen  阅读(633)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
0
0
关注
跳至底部
document.getElementById("homeTopTitle").innerText="ღKawaii";
点击右上角即可分享
微信分享提示