大家都说学习程序最好的方式就是读别人写的源码,然后去实现他。但是我作为一个自学软件开发的人员,从来没有人指导过我应该如何去学习一个没有清楚文档的软件的最适当的方式。而Discuz!nt正好是是这样的一个软件。一个能被腾讯收购的软件,肯定差不到那里去,我不敢说他是中国最好的.net web程序,但是也算中国数得着的开源.net程序中的优秀程序。但是我在网络上搜了很久,没有见到一份良好的文档。很长时间都感觉看着那20多个项目无从下手去研究。于是想了想,还是决定跟踪他的过程和功能,研究他代码的实现,然后再把研究过的内容进行整理,整理出来他的总体结构,然后研究他的架构。所以先来研究Discuz!nt的安装部分的实现。
从Discuz.web项目来看,在install项目文件夹中实现了所有的安装页面。一共Index.aspx,step2.aspx,step3.aspx,step4.aspx,succeed.aspx,systemfile.aspx几个文件。
Index.aspx的研究
<%@ Import Namespace="Discuz.Common" %> <%@ Import Namespace="Discuz.Install" %>
把类库Discuz.Common和Discuz.Install引入到页面中,从名字上看,应该是Discuz.common中应该是定义了一些Discuz中通用的类和变量方法,而Install中应该是定义了Install专属内容。
我们先跟着html继续往下走。
<%=SetupPage.producename%> <%=SetupPage.logo%>
使用<%=%>的方式输出内容是在asp时代的专属,现在很多学习.net的只学习会了拖拉空间,看到页面中有这个内容不知道是什么意思,其实就是Response.Write(内容),把内容直接输出html.而输出的内容是SetupPage里面的变量。
下面我们去看看SetupPage类的内容(Discuz.Install.SetupPage)。
public static readonly string producename = Utils.GetAssemblyProductName(); //当前产品版本名称 public static readonly string footer = ""; public static readonly string logo = "<img src="/" mce_src="/""images/logo.jpg/" width=/"180/" height=/"300/">"; //安装的LOGO public static readonly string header = ""; //html页的的<head>属性
首先我们看到在SetupPage中声明了很多静态的变量。这些变量可以在输出的时候直接调用。方便显示一些通用信息。
static SetupPage() { header = "<HEAD><title>安装 " + Utils.GetAssemblyProductName() + "</title><meta http-equiv=/"Content-Type/" content=/"text/html; charset=utf-8/">/r/n"; header += "<LINK rev=/"stylesheet/" media=/"all/" href="/" mce_href="/""css/styles.css/" type=/"text/css/" rel=/"stylesheet/"></HEAD>/r/n"; header += "<mce:script language=/"javascript/" src="/" mce_src="/""js/setup.js/"></mce:script>/r/n"; footer = "/r/n<br />/r/n<br /><table width=/"700/" border=/"0/" align=/"center/" cellpadding=/"0/" cellspacing=/"0/" ID=/"Table1/">"; footer += "<tr><td align=/"center/"><div align=/"center/" style="/" mce_style="/""position:relative ; padding-top:60px;font-size:14px; font-family: Arial/">"; footer += "<hr style="/" mce_style="/""height:1; width:600; height:1; color:#CCCCCC/" />Powered by <a style="/" mce_style="/""COLOR: #000000/" href="/" mce_href="/""http://nt.discuz.net/" target=/"_blank/">" + Utils.GetAssemblyProductName() + "</a>"; footer += " <br />© 2001-" + Utils.GetAssemblyCopyright().Split(',')[0] + " <a style="/" mce_style="/""COLOR: #000000;font-weight:bold/" href="/" mce_href="/""http://www.comsenz.com/" target=/"_blank/">Comsenz Inc.</a></div></td></tr></table>"; }
初始化函数则是把footer变量给复制。我有个小小的疑问,为什么不适用StringBuilder呢?第一操作方便,第二,效率高。恳求解释