一步步打造基于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

 

posted @ 2010-05-16 08:44  启明星工作室  阅读(1987)  评论(3编辑  收藏  举报