利用商務對象來工作
在商務組件中封裝邏輯是實際應用程式,比如基於web的應用以及其他應用中,必不可少的部分。在ASP.NET中,商務對象是多層WEB應用程式內建的塊。
應用程式的 /Bin目錄
在傳統的ASP應用程式中使用COM組件的時候有一個問題,那就是這些組件在使用前必須被註冊(典型的做法是使用regsvr32工具)。遠端管理這種類型的的應用程式很不現實,因為註冊工具必須在本機伺服器運行。更麻煩的是,這些組件一旦被應用程式載入,就在磁碟上保持鎖定狀態。要想替換或者移去他們,整個web伺服器必須停止。
ASP.NET試圖通過允許將組件放置在眾所周知的目錄中,在運行時被自動找到來解決這些問題。這個眾所周知的目錄通常叫做 /bin ,直接位於應用程式的根目錄(由IIS定義的虛擬目錄)下。這樣的好處在於ASP.NET應用程式使用組件時不需要註冊---僅僅需要將組件複製到 /Bin目錄或者通過FTP上傳到/Bin目錄。
除了提供“零註冊”的方法來部署編譯過的組件外,ASP.NET不要求這些組件在運行時在磁碟上保持鎖定。其內幕是,ASP.NET將這些在/Bin目錄中找到的彙編檔案進行複製,並替換成裝載這些“影子”副本來使用。原始的組件甚至可以在Web伺服器啟動並執行過程中被替換,/Bin目錄的變化情況自動被運行時刻獲得。當檢測到變化的時候,ASP.NET允許當前執行的請求完成,並且指揮所有新的請求使用新的組件。
引入商務對象
從底層來說,商務組件僅僅是一個類,你可以從引入它的Web頁面來建立或者執行個體化它。下面的例子定義了一個簡單的HelloWorld類。該類有一個公用的構造器(當一個類的執行個體第一次被建立的時候它被執行),一個叫做FirstName的String屬性,以及一個使用FirstName的屬性來顯示問候的SayHello方法。
using System;
using System.Text;
namespace HelloWorld {
public class HelloObj {
private String _name;
public HelloObj() {
_name = null;
}
public String FirstName {
get {
return _name;
}
set {
_name = value;
}
}
public String SayHello() {
StringBuilder sb = new StringBuilder("Hello ");
if (_name != null)
sb.Append(_name);
else
sb.Append("World");
sb.Append("!");
return sb.ToString();
}
}
}
為了編譯這個類,C#編譯器(Csc.exe)需要從命令列執行。/t 選項通知編譯器建立一個類庫(DLL), /out 選項通知編譯器將編譯結果放在什麼位置。在本例中,應用程式的/bin目錄在本教程的"aspplus" 虛擬目錄下。並且假定命令列可以在執行個體所在目錄下運行,即.../QuickStart/AspPlus/Samples/WebForms/Busobjs目錄下運行。
csc /t:library /out:../../../../bin/HelloObj.dll HelloObj.cs
對於Visual Basic, 等價的編譯命令是:
vbc /t:library /out:../../../../bin/HelloObjVB.dll HelloObj.vb
對於JScript, 等價的編譯命令是:
jsc /out:../../../../bin/HelloObjJS.dll HelloObj.js
現在這個組件可以被應用程式中需要使用它的任何頁面使用了。下面的HelloObj.aspx說明了這個功能。
C# HelloObj.aspx
[運行] | [[源檔案]
注意頁面上面的Import指令指定了要包含的名稱空間。一旦使用這條命令包含了名稱空間,就可以在這個頁面中使用名稱空間中定義的類了。下面的命令例示了Import指令
<%@ Import Namespace="HelloWorld" %>
預設情況下,當應用程式啟動的時候,ASP.NET 從/Bin目錄載入所有的彙編檔案。彙編檔案的載入通過配置系統來指定。詳細情況請參閱Configuration Overview 部分。額外的彙編檔案也可以使用設定檔倒入應用程式。例如:
<configuration>
<compilation>
<assemblies>
<!--The following assemblies are loaded explicitly from the global cache-->
<add assembly="System.Data"/>
<add assembly="System.Web.Services"/>
<add assembly="System.Drawing"/>
<!--This tells ASP.NET to load all assemblies from /bin-->
<add assembly="*"/>
</assemblies>
</compilation>
</configuration>
注意: 從/Bin目錄裝載的彙編檔案被限制在應用程式啟動並執行範圍之內。這就意味著,同等的應用程式可以潛在的使用不同的包含具有相同類名或者名稱空間的彙編檔案,而無需配置。
一個簡單的兩層WEB頁面
本例中外部組件使用的類用來執行資料訪問。這就簡化了頁面的代碼,提高了可讀性,並且從系統功能中分離了使用者介面邏輯。下面的例子示範了一個簡單的兩層WEB頁面,它使用了資料訪問組件來取得產品的資訊。
C# twotier.aspx
[運行] | [[源檔案]
資料訪問組件中的構造器帶有一個參數,用來指定產品資料庫的連接字串。WEB頁面調用組件的GetCategories方法來組裝下拉式清單,調用組件的GetProductsForCategory方法來顯示使用者選擇的產品種類。
一個簡單的三層WEB頁面
三層應用程式模型對兩層模型的情況進行擴充,在使用者介面和資料訪問邏輯之間包含了商務規則。這種模型允許使用者介面開發人員工作在較高的抽象層,而不是通過低層的資料訪問組件介面直接操作資料。中介層的商務組件典型的用法是實施商務規則、確保資料庫關聯和主關鍵字約束的承兌。下面的例子使用中間組件,根據用戶端輸入的兩位元的廠商ID來計算折扣。
C# threetire.aspx
[運行] | [[源檔案]
本章小節
1.ASP.NET 運行時刻在著名的 /Bin目錄中尋找商務對象(本地彙編檔案) ,該目錄位於應用程式的根目錄下。/Bin 目錄提供了下列的優點:
a.無需註冊.
b.無需伺服器重啟.
c.沒有名稱空間的衝突.
2.通過在.aspx檔案中使用Import 指令,可以讓應用程式的頁面使用彙編中的類。
3.兩層模式的應用程式簡化了頁面中的代碼,提高了可讀性,從系統功能中分離了使用者介面邏輯。
4.三層模式應用程式擴充了兩層模型,允許使用者介面開發人員工作在較高的抽象層。中間的商務組件典型的用法是實施商務規則、確保資料庫關聯和主關鍵字約束的承兌。
待續==接下來的部分是建立自訂控制項,敬請期待