<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 對核心架構進行了一次大的改寫,但主要集中在資料存儲層和業務邏輯層。這次改寫促使我們認識到完善換膚系統的重要,并最終完成了這個穩定的換膚系統,這個系統清晰的把“表現”和“功能”分開了。下面就要開始詳細的講解具體的技術實作細節。
====未完,待續====