一步步打造基于ASP.NET的CMS内容管理系统--Step2 系统配置(附源代码)
许多应用程序都需要配置,例如在Dotnetcms Portal里就有对应用程序的简单配置需求,在线演示:http://portal.dotnetcms.org/ep/portal/admin/setting.aspx
这种配置可以用数据库作为存储,但是仅仅为了一个记录,建立一个表格,有点太浪费,所以最好用xml进行以文本方式存放,在配置不大的情况下,读写文本文件比数据库要快,例如在本例中,我们可以把程序配置叫做portal.xml,但是.NET有一个更优雅的配置名称:config,所以这里我们就把系统设置,命名为portal.config,至少,在本系统里,如果以后有投票配置、邮件配置,命名为vote.config,email.config好听又好理解。
Portal.config里存放的是应用程序的配置,对他的读取,我们可以利用像读取txt文件一样读其他,然后进行处理,但是还有更好的方式:序列化和反序列化。先看示意图,似乎有点类似数据库中的ORM,也就是一个xml的配置节对应一个类的属性
序列化就是把类转换为XML
反序列化就是把XML转换为类
NET提供了三种序列化方式XML Serializer,SOAP Serializer,BinarySerializer.
要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:
[Serializable]
public class Class
{ }
但是也可以传递类类别。
将类的实例序列化成一个Xml文件核心代码是
XmlSerializer ser = new XmlSerializer(obj.GetType());
ser.Serialize(new FileStream(@"portal.config, FileMode.Create), obj);
反序列化:
XmlSerializer serializer = new XmlSerializer(Type.GetType("MyObject"));
MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));
因此,这里我们模仿了DiscuzNT的方式,首先设定了一个序列化/反序列化的类码
public static string Serialize(object obj) { string returnStr = ""; XmlSerializer serializer = GetSerializer(obj.GetType()); MemoryStream ms = new MemoryStream(); XmlTextWriter xtw = null; StreamReader sr = null; try { xtw = new System.Xml.XmlTextWriter(ms, Encoding.UTF8); xtw.Formatting = System.Xml.Formatting.Indented; serializer.Serialize(xtw, obj); ms.Seek(0, SeekOrigin.Begin); sr = new StreamReader(ms); returnStr = sr.ReadToEnd(); } catch (Exception ex) { throw ex; } finally { if (xtw != null) xtw.Close(); if (sr != null) sr.Close(); ms.Close(); } return returnStr; } public static object DeSerialize(Type type, string s) { byte[] b = System.Text.Encoding.UTF8.GetBytes(s); try { XmlSerializer serializer = GetSerializer(type); return serializer.Deserialize(new MemoryStream(b)); } catch (Exception ex) { throw ex; } }
接下来,定义一个 IConfigInfo和PortalConfigFileManager 方便我们扩展,其中后者包含了LoadConfig(),SaveConfig()用来读写配置文件,
(注:本文不是介绍面向对象的文章,如果您不熟悉类,接口,虚拟方法等,可以找些这方面的书,此处我们认为您已经熟悉这些内容,本文附近包含所有源代码)
下面看看我们的portalinfo类
代码
public class PortalConfigInfo: IConfigInfo
{
public int Thumwidth{get; set;}
public int Thumheight { get; set; }
public string Isthumhighquality { get; set; }
public string Sitetitle { get; set; }
public string Keywords { get; set; }
public string Description { get; set; }
public string Comment { get; set; }
}
现在,在Setting.aspx的Page_Load里读取配置,调用GetConfig方法
PortalConfigInfo portalInfo = PortalConfigs.GetConfig();
thumheight.Text = portalInfo.Thumheight.ToString();
thumwidth.Text = portalInfo.Thumwidth.ToString();
...
保存也超级简单,
...
portalInfo.Isthumhighquality = Isthumhighquality.SelectedItem.Value;
portalInfo.Comment = comment.SelectedItem.Value;
PortalConfigs.SaveConfig(portalInfo);
OK,这样一个配置文件读写就完成了。
-------------------------------------------------------------------------------------------------------------------------
以下是广告时间,请别走开,精彩马上回来
Dotnetcms Portal (DEMO: http://portal.dotnetcms.org )主要面向企业内部网站建设,Dotnetcms 是有很多模块组成,我们也在不断完善系统 后台
http://portal.dotnetcms.org/ep/portal/admin/setting.aspx
------------------------------------------------------------------------------------------------------------------------
本文源代码下载(.NET3.5 +)
https://files.cnblogs.com/mqingqing123/DemoXML.rar