孫展波的Blog中已經描述了對於特殊目錄,Beta2相對Beta1所做出的調整。除此之外,Beta2的編譯模型相對Beta1也會做一個相當大的修改。
首先回到ASP.NET 1.1的“遠古時代”,看看ASP.NET引擎是如何處理分頁檔和Code-Behind檔案的。
我們在分頁檔的上方通常會看到這樣一句聲明:
<%@ Page CodeBehind="Default.aspx.cs" Inherits="WebApplication1.CDefault" %>
當我們在分頁檔上加入一個新的ASP.NET控制項時,VS.NET自動會在Code-Behind代碼檔案中增加一個protecte的對象聲明,並在代碼中使用和操作這個對象。VS.NET會時刻維護分頁檔中的控制項與代碼檔案中的控制項對象聲明之間的同步。
當我們編譯網站時,VS.NET將所有Code-Behind檔案編譯在一起,產生一個位於/bin目錄中的.dll檔案。然後,我們將所有的分頁檔和/bin部署到伺服器上。當使用者瀏覽分頁檔時,ASP.NET引擎自動根據頁面中的內容,產生一個.cs的類檔案,並根據分頁檔頭部聲明中的“Inherits”所指定的內容,讓這個類從指定的父類繼承下來。這樣,頁面就和後台代碼檔案中的內容通過“繼承”的方式結合在了一起。
這種頁面編譯模型最大的問題,就是頁面中的控制項,必須時刻與Code-Behind中的控制項對象聲明保持同步,雖然開發人員“意識”不到這一點,但是如果VS.NET出錯而未能同步,就會損壞這種通過“繼承”來串連的關係。
OK,在ASP.NET 2.0 Beta1中,我們終於可以用更加優雅的方式來實現了分頁檔和Code-Behind檔案的分離和串連了。由於有了partial class這個新的語言特性,我們終於可以擺脫巧妙、但“笨拙”的繼承串連關係。為了體現Beta1中後台代碼檔案的特點,我們乾脆直接把後台代碼檔案叫Code-Beside檔案。
在分頁檔的頂端,會如下面所示範的這樣做一個聲明:
<%@ Page Language="C#" CompileWith="Default.aspx.cs" ClassName="Default_aspx" %>
注意,VS.NET在開發時不會給我們提供一個手段,把所有的Code-Beside檔案都編譯到/bin裡面的一個.dll中。
部署時,我們直接把所有的分頁檔和Code-Beside檔案直接XCopy到伺服器上。當使用者瀏覽頁面時,ASP.NET引擎自動根據頁面上的內容,產生一個partial類,然後與Code-Beside中的partial類整合在一起,最後完成編譯。這個編譯過程(分頁檔和Code-Beside)完全是在運行時動態完成的,如果我們修改了分頁檔或者Code-Beside檔案,都不需要做任何手工操作,ASP.NET引擎會自動在下次瀏覽時重新進行編譯動作。
嗯,當然,很多人會覺得不爽,“為啥我要把後台代碼檔案也給部署上去呢?”所以,ASP.NET Beta1也提供了其他的編譯部署方案,比如,把整個網站的所有內容,包括分頁檔和Code-Beside檔案統統編譯成一個.dll,然後部署到伺服器上。
最後,終於,我們可以來看看ASP.NET Beta2中,頁面編譯模型又發生了什麼變化。
分頁檔頂端的聲明變成了如下所示:
<%@ Page CodeFile="Default.aspx.cs" Inherits="Default_aspx" %>
怎麼樣?看到“Inherits”,是不是懷疑又走回ASP.NET 1.1的老路了?對,也不對。
當使用VS.NET建立一個頁面的時候,VS.NET會自動建立一個Code-Behind(我們重新用回Code-Behind這個詞)檔案,當我們在頁面上增加一個控制項的時候,VS.NET如同Beta1一樣,並不會在Code-Behind中增加一個什麼聲明。但是,當我們編譯網站的時候,VS.NET自動根據分頁檔的內容,產生一個“臨時中間”partial類,然後把這個partial類和Code-Behind中的partial類整合編譯,最終產生一個位於/bin中的.dll檔案。
部署時,我們如同ASP.NET 1.1中一樣,把/bin和所有分頁檔部署到伺服器上。當使用者瀏覽頁面時,ASP.NET引擎根據頁面內容產生一個類檔案,然後根據檔案頭部聲明的“Inherits”的值,讓這個類檔案從指定的父類繼承下來,最後完成編譯過程。
總之,Beta2的頁面編譯模型吸收了ASP.NET 1.1和ASP.NET 2.0 Beta1的優點,我們既可以把網站的所有後台代碼編譯好,然後和所有分頁檔一起部署,也獲得了Beta1中,開發時後台代碼檔案中不需要另外聲明頁面控制項對象的好處。
當然,對於開發人員來說,這一切都是在“蓋子”底下運作,我們不需要瞭解這些,就可以方便的進行開發。
微軟會在11月份推出一個新的Community Technical Preview(CTP),將會體現所有的這些變化。Beta2預計會在明年年初發布,Beta2的設計基本上延續到RTM。
更加詳細的資訊,請參考MSDN上的這篇文章。