程序的界面与业务逻辑的分离是现在大家的共识, 即所谓的MVC, 应该说, ASP.net中的控件模式已经为MVC模式做了实现, 但Discuz!NT还是选择了另外一种方式. 这主要是基于以下考虑:
1 模板制作者的接受度. Discuz!NT是一个通用型产品, 用户为广大论坛站长, 各个论坛都有自己的界面个性化需求, 因此界面模板的制作必须容易被各个普通站长学习掌握, 而ASP.net的ascx文件对于没有学习过ASP.net或对其开发模式没有了解的人来说, 是存在难度的. Discuz!NT使得用户了解html基本就可以制作ASP.net论坛界面, 站长可以轻松掌握如何修改和设计界面.
2 一般情况下, 前台程序不使用控件模式, 性能都得到了提升. 控件的开发方式比较有利于提高开发效率, 提高模块的重用性, 但缺陷是性能上会有一些损失, 例如不用数据绑定, 显然也就不必判断数据来源和转换数据类型, 不用页面控件和控件事件等, 也就避免了使用ViewState, 此外控件往往追求功能齐全, 当你只需要一部分功能时, 大量无用的代码同样会拖累性能.
这两点简单归纳起来就是提高了易用性和性能.
Discuz!NT使用的界面模板方式与一些其它Web程序有相似之处, Discuz! (php)采用的方式是将模板html文件转换为php文件, 然后在相应php程序文件中#include进来, 另一个国外ASP.net程序DNN则是将html文件翻译为了ascx文件. Discuz!NT采用的模式可以认为是对前者的模式又进行了层次的划分(界面与业务分离), 也可以认为是后者的更进一步(既然那些ascx也是自动生成了, 何不干脆aspx化让第一次执行前的编译更简单?)
Discuz!NT的前台页面层次如下:
如果还是不太清楚, 则以文件类型可以直观描述如下:
用户的html模板文件在后台选择生成模板时被转换为aspx文件, 负责进行Discuz!NT前台的页面显示(例如showuser.htm被转换为showuser.aspx)
aspx.cs文件为页面类, 负责接收用户提交, 获取页面所需要的各种变量并"交付"给aspx文件, 这里是实现论坛功能的主要部分(例如showuser.aspx.cs为showuser.aspx提供变量具体数据)
对于一些常用的论坛对象, 又进行了业务对象封装以方便使用(例如对用户的信息封装为UserInfo类, 用户常用操作封装于UserFactory类)
当然, 除了显示层外, 其它层次的代码最后都被编译进DLL文件中, 对于纯粹只是使用的站长来说, 你一般只需要修改显示层即可满足你的界面修改要求.
以上所讲述的是大概的层次结构, 具体细节会在后面的章节中逐步提到.