<a href="#_Toc191632723">介绍</a>
<a href="#_Toc191632724">使用术语</a>
<a href="#_Toc191632725">实现技术</a>
<a href="#_Toc191632726">系统定义</a>
<a href="#_Toc191632727">DotNetNuke改进</a>
传统的专业网站设计公司主要依赖设计静态网页生存,然而,随着低费用的门户网站应用程序出现,消费者很快尝到了动态网站的甜头。为了适应新的需求,网页设计者需要时刻关注这些新技术的发展。DotNetNuke中的换肤系统可以让专业的网页界面设计者创造出与底层门户应用程序无缝结合用户界面,开发出具有强大功能而在视觉上又满足客户需要的web站点。
词汇“换肤(Skinning)”指的是一种可管理的软件架构,这种架构把应用程序的逻辑和内容与它的外观分开。这种“形状”与“功能”的抽象方式也被称之为两层表现模式。程序的逻辑和网页的外观是分开的,并且可以单独的设计和修改。这样,软件开发人员和网页界面设计人员就可以同时工作而不用担心会相互牵扯。
ASP作为一种RAD工具如此受欢迎的主要原因是ASP Script可以插入平常的HTML代码中,从而使静态的HTML代码变成动态。这个特点使ASP可以快速的写出从一个数据库(或者其它外界数据源)动态生成网页的应用程序,最终构成一个强大的网站。
然而,这种易用性也是要付出代价的。大部分ASP网站包含了大量HTML代码和ASP Script混杂在一起的页面,这些页面难以阅读和理解,更难以维护。当网页设计者要修改用户界面时往往会遇到难题。因为表现层的代码和ASP Script是混在一起的,只有网站界面设计者和网站程序设计者一同工作才能确保修改成功,这耗时耗力还耗钱。
换肤使用“模板(templates)”把外观和版式与网站的逻辑分开。一个设计精巧的换肤系统会把模板和最终的网站捏合在一起。在维护网站时,这种两层结构可以使程序开发人员和界面设计人员独立的维护各自的部分,这样在网站发布后的维护阶段,可以节省大量的时间和精力。
当然,换肤也会给你网站带来一些复杂性,把多个文件合成一个网页是一项非常影响效率的事,更不用说代码开发人员还要学习如何把功能的部分抽象出来,让界面的代码分离出去。所有的这些问题都可以通过技术和良好的皮肤构架得到缓解。
术语“换肤”不同的人有不同的理解,一般的情况,换肤系统提供一个固定的版式,允许我们更改配色、风格甚至可以更换图片。更高的要求是,除了本身存在的内容,皮肤可以让我们自由地定制用户界面的每一个地方。在这两种极端之中,还有很多不同的方案,不同的需求决定如何取舍。
Windows桌面应用程序很早就可以“换肤”了,你会以为网站也可以完全达到桌面应用程序的效果,这种想法是错误的,
因为桌面应用程序和网站有天然的不同,桌面应用程序的皮肤是储存在本地的,可以实现非常华丽、多样的效果而不用担心效率上的问题。但网站的每一次页面请求都要把皮肤与内容组合再通过网络传送到客户端,这就要求一个高效的渲染系统。
把用户界面从网页上抽象出来有很多方法,不同的方法对界面和业务逻辑的分离成度不同,所以,在何时对程序的哪个部分如何分解成为了关键。
把用户界面文件中需要动态生成的部分用占位符(tokens)或者标记(identifiers)来表示是很多脚本语言常用的方法,但页面被处理时,这些占位符被实际的程序逻辑所取代。我们先不讨论取代算法(比如智能解析、字符串函数、正则表达式等等……)的效率,对于网页应用程序换肤最重要的一点是“什么时候这个处理进行“,如果对于请求的每一页都要进行这种处理,效率将会受到影响。为了降低这种影响,我们可以使用预处理和编译的方法。
ASP.NET提供了非常强大的功能用来把网页抽象成各个不同的部分,用户控件(User Controls)和ASP里的#include 功能有点像。用户控件使你能把界面上重复的功能独立出来并用在其它的页面上。一个用户控件几乎和一个aspx网页一样,只是两点不一样:一个是扩展名为.ascx,而不是.aspx;二个是没有<HTML>, <Body>或者 <Form>标记。用户控件可以再被分为表示层的文件,应用逻辑文件(或者程序代码文件)等多个文件。这种功能允许创建多个表现层的文件并指向同一个程序代码文件。因为ASP.NE是一种预编译语言,由多个用户控件组成的网页合成并渲染是非常高效的,比非预编译和解释语言要快多了。
换肤系统设计要考虑的另一个方面就是如何让作者署名,那些人会制作皮肤?要制作出皮肤,这些人对皮肤技术上的实现需要了解多深?这些人会是用什么样的工具?这些方面的需求分析对皮肤如何定义起很大的作用。
尽管ASP.NET的用户控件给我们提供了一个解决问题的核心的技术,但却是一个相对较新的概念,并且只对使用Microsoft开发平台人比较熟悉。尽管很多网页设计工具(如FrontPage、Dreamweaverd等等)支持用户控件,但对很多专门做网页界面设计的设计者来说,用户控件还是很陌生。更不用说用户控件还包含一些ASP.NET的服务器端控件,这些控件对网页界面设计者来说完全不必接触。我们必须考虑在制作皮肤过程中,网页界面设计者很有可能无意修改或者删除关键的服务器端控件,只是绝对要避免的。最理想的方案是,网页界面设计者可以自己选择设计工具并且完全不用了解用户控件的技术知识。
根据上面的分析,换肤系统要给网页界面设计者提供一个最简单、通用的方法设计皮肤。HTML是因特网最原始的语言,并且被各种工具广泛的支持。唯一的问题是HTML是静态的,但皮肤是动态的。
回想一下之前提到过的占位符方法,网站开发人员使用这种方法在HTML里用占位符表示动态的功能用。“外观”和“功能”区分的很清楚。用户界面的修改不会影响到程序的逻辑,程序逻辑的修改不会影响到用户界面。使用这样的两层结构的唯一坏处就是影响性能。
DotNetNuke 1.0.0 到 1.0.10提供了一个非常简单的换肤功能,可以允许你更换logo、颜色还有风格来简单地定制一下网站。很快,这个简单的换肤功能就不能适应需要了,好几个项目被建立用来开发一个更加健壮的换肤系统。
不幸的是,随着事情的发展,不同的人对什么是最好的解决方案有不同的意见。很快,DNN社区里面就出现了很多不同的换肤解决方案,各种方案各有优劣。DotNetNuke必须从这些方案里选择一个作为核心方案。但对于我们之前描述的那些商业需求,没有一个解决方案是可以完全满足的。所以,我们必须谨慎地提出一个比较全面的设计草案,并引导开源社区的开发人员去完善这个草案。
DotNetNuke 2.0 对核心框架进行了一次大的改写,但主要集中在数据存储层和业务逻辑层。这次改写促使我们认识到完善换肤系统的重要,并最终完成了这个稳定的换肤系统,这个系统清晰的把“表现”和“功能”分开了。下面就要开始详细的讲解具体的技术实现细节。
====未完,待续====