ASP.NET中新的代碼編譯功能(一)

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- ASP.NET中新的代碼編譯功能(一) (http://www.webasp.net/article/19/18074.htm)
-- 作者:未知
-- 發佈日期: 2005-04-28
摘要:瞭解如何利用 ASP.NET Whidbey 更輕鬆地使用代碼。Code 目錄會自動為您的站點編譯代碼,而預編譯會使部署工作更容易。

下載本文的源代碼。(請注意,在示例文件中,程序員的註釋使用的是英文,本文中將其譯為中文是為了便於讀者理解。)


簡介

即將推出的新版 Microsoft® ASP.NET 介紹了大量新功能和改進功能,它的代號為 ASP.NET Whidbey,是根據新版 Microsoft® Visual Studio® .NET 的代號命名的。其中的某些功能利用了基礎 Microsoft® .NET Framework 版本(ASP.NET Whidbey 就是基於該版本構建的)中的新功能。在這些功能當中,最有用的功能集之一與代碼編譯有關。本文介紹 ASP.NET Whidbey 編譯模型的主要更改、這些更改對編寫 ASP.NET 應用程序的影響,以及如何利用這些更改。

改進的功能和新的編譯功能可以分為以下四個基本方面:

1.對模塊化代碼模型的改進。
2.新的 Code 目錄。
3.新增的對預編譯 ASP.NET 應用程序的支持。
4.Microsoft® IntelliSense® 增強功能。

新的模塊化代碼模型

默認情況下,使用 Visual Studio .NET 2002 或 2003 開發的站點使用一種稱為「模塊化代碼」的功能將可視元素(HTML 標記、控件等)從與 UI 相關的編程邏輯中分離開來。當開發人員創建一個新 Web 窗體(例如 foo.aspx)時,Visual Studio 會自動創建一個相關的 Codebehind 類文件,該文件名稱的前一部分與 Web 窗體相同,後面是 .vb 或 .cs(取決於項目使用的語言)。類文件將通過 @ Page 指令的 Codebehind 和 Inherits 屬性與 Web 窗體相關聯。

類文件包含事件處理代碼(包括用於將事件處理程序綁定到相應事件的代碼),以及每個控件(通過 Visual Studio Web 窗體編輯器添加到 .aspx 文件中)的分離聲明。編譯(生成)Web 應用程序項目後,其中的所有 Codebehind 類都將編譯到一個 .NET 程序集中,該程序集將放置到 Web 應用程序的 \bin 目錄中。Web 窗體頁本身會在運行時動態進行編譯,並且每個 Web 窗體均繼承自與其相關的 Codebehind 類。

雖然最初的模塊化代碼模型理論上不錯(誰不希望將 UI 元素與編程邏輯相分離呢?),但它還是有一些缺點:

·需要重新生成。在 Visual Studio .NET 中,運行時不會自動編譯 Codebehind 類,因此對 Codebehind 類的任何更改都需要重新生成整個項目以應用這些更改。(請注意,您可以通過 @ Page 指令的 src 屬性指定對模塊化代碼文件進行動態編譯,但默認情況下 Visual Studio .NET 不會執行此操作。)

·共享開發問題。由於項目中的所有 Codebehind 類都編譯到了一個程序集中,所以很難讓多個開發人員同時開發一個項目而不會遇到瓶頸問題。

·代碼易被破壞。控件同時通過聲明(在 .aspx 頁面中)和編程(在 Codebehind 類中)的方式存在,如果這兩組控件沒有正確同步,很容易使代碼遭到破壞。

·複雜程度增加,而且缺少單文件支持。在 Visual Studio .NET 中,很多用於提高生產率的功能(包括 IntelliSense 語句完成)都需要使用模塊化代碼。遺憾的是,這些功能通常會在 Codebehind 類中添加大量相對複雜的代碼,這就產生了代碼易被破壞的問題,因為更改 Visual Studio .NET 插入的代碼很容易破壞頁面。

瞭解到這些缺點後,負責開發 ASP.NET 和 Visual Studio .NET Whidbey 的小組決定重新考慮模塊化代碼模型。新的模塊化代碼模型利用了 Microsoft® Visual Basic® .NET 和 C# 中稱為局部類(在 C# 中稱為局部類型)的新功能。局部類使您能夠在多個文件中定義一個類的不同部分。編譯時,由編譯器將這些部分再組合到一起。ASP.NET Whidbey 使用 @ Page 指令中新的 CompileWith 和 Classname 屬性來標識要與 .aspx 頁面結合的 Codebehind 局部類。通過利用局部類,再進行一些其他更改,ASP.NET 小組可以實現以下目的:

·無需在 Codebehind 類中編寫控件聲明和事件綁定代碼(在控件聲明中通過聲明的方式綁定事件)。

·允許運行時同時對 Web 窗體頁和 Codebehind 類進行動態編譯,無需再為細微的更改而重新生成整個項目。

·減少共享開發中的文件爭用現象。

·對於使用模塊化代碼文件的開發人員以及喜歡單文件開發(所有代碼和標記均包含在 .aspx 文件中)的開發人員,均可獲得相同的 IDE 體驗。

下面給出了模塊化代碼模型更改前後的不同視圖。以下代碼只是在使用模塊化代碼添加新的 Web 窗體(在 Visual Studio .NET Whidbey 中稱之為具有代碼分隔的 Web 窗體)時,由 Visual Studio 創建的默認代碼:

Visual Studio .NET 2002/2003
WebForm1.aspx:

<%@ Page Language="vb" AutoEventWireup="false"
  Codebehind="WebForm1.aspx.vb" Inherits="TestWebApp_121602.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>WebForm1</title>
    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema
      content="http://schemas.microsoft.com/intellisense/ie5">
  </head>
  <body MS_POSITIONING="GridLayout">    <form id="Form1" method="post" runat="server">
   </form>
  </body>
</html>
WebForm1.aspx.vb:

Public Class WebForm1
    Inherits System.Web.UI.Page

#Region " Web 窗體設計器生成的代碼 "

    '此調用是 Web 窗體設計器所必需的。
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()

    End Sub

    '注意:以下佔位符聲明是 
    'Web 窗體設計器所必需的。
    '請勿刪除或改變其位置。
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN:此方法調用是 Web 窗體設計器所必需的。
        '請勿使用代碼編輯器修改它。
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
        '此處放置用於初始化該頁面的用戶代碼
    End Sub

End Class


Visual Studio .NET Whidbey

Default.aspx:

<%@ page language="VB" compilewith="Default.aspx.vb"
  classname="ASP.Default_aspx" %>

<html>
<head runat="server">
    <title>無標題頁</title>
</head>
<body>
    <form runat="server">

    </form>
</body>
</html>


Default.aspx.vb:

Imports Microsoft.VisualBasic

Namespace ASP

Expands Class Default_aspx

End Class

End Namespace


從上面的示例可以清楚地看到,由 Visual Studio .NET Whidbey 生成的代碼更加清晰、易讀。無需犧牲拖放功能或 IntelliSense 來實現此目的。

\Code 目錄

ASP.NET Whidbey 中的另一個非常酷且實用的新功能是增加了 \Code 目錄。\Code 目錄與 \bin 目錄類似,是 ASP.NET 使用的一個特殊目錄,但它與 \bin 目錄又有所不同:\bin 目錄用於存儲由應用程序使用的預編譯程序集,而 \Code 目錄用於存儲要在運行時進行動態編譯的類文件。這使您可以將業務邏輯組件、數據訪問組件以及其他組件的類存儲在應用程序中的某個位置,並從任意頁面使用這些類。因為這些類是在運行時動態編譯的,而且會被包含 \Code 目錄的應用程序自動引用,所以在部署項目之前不需要生成項目,也不需要明確添加類引用。您可以放心地對組件進行更改,然後使用簡單的 XCOPY 或拖放操作進行部署。除了簡化組件的部署和引用外,\Code 目錄還極大地簡化了本地化過程中使用的資源文件 (.resx) 的創建和訪問過程,以及為 WSDL 文件 (.wsdl) 自動生成和編譯代理類的過程。為了更好地說明上述操作的實現過程,讓我們先來看幾個示例。在第一個示例中,我們將看到如何創建一個簡單的業務組件,以及如何從 Web 窗體頁對其進行訪問。

webasp.net