摘要:ECO是Borland/CodeGear在.NET平臺(tái)下實(shí)現(xiàn)出來的,根據(jù)模型驅(qū)動(dòng)開發(fā)(Model Driven Development,MDD)為核心發(fā)展出來的軟件架構(gòu);而Ajax作為Web開發(fā)的熱點(diǎn),在提高數(shù)據(jù)交互,改善用戶體驗(yàn)等方面發(fā)揮著重要作用。本文通過用戶注冊驗(yàn)證的設(shè)計(jì),說明了通過Web服務(wù),ECO和Ajax二者之間能實(shí)現(xiàn)有機(jī)的結(jié)合,從而讓開發(fā)人員真正領(lǐng)略到高效的開發(fā)能力,同時(shí)帶來更好的用戶體驗(yàn)。
關(guān)鍵詞: ECO; Ajax;Web Service;.NET
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)14-20848-04
1 引言
隨著高生產(chǎn)力和高品質(zhì)軟件的要求標(biāo)準(zhǔn)不斷的提高,“簡化與快速開發(fā)”已成為軟件開發(fā)人員追求的重要目標(biāo)。在“快速開發(fā)”的同時(shí),提供豐富的、可交互的和個(gè)性化的用戶體驗(yàn),對提高Web應(yīng)用程序開發(fā)的品質(zhì)和效率,具有重要的現(xiàn)實(shí)意義。
2 ECO與Ajax相結(jié)合的模式
2.1 ECO開發(fā)架構(gòu)
ECO(Enterprise Core Objects)是根據(jù)模型驅(qū)動(dòng)開發(fā)(Model Driven Development,MDD)為核心發(fā)展出來的技術(shù),并且結(jié)合OR Mapping、圖形用戶界面綁定、對象服務(wù)構(gòu)架以及許多其他豐富的功能而形成的,在.NET平臺(tái)下實(shí)現(xiàn)出來的軟件工程。
2.1.1 模型驅(qū)動(dòng)開發(fā)(Model Driven Development,MDD)
MDD的基本構(gòu)想是開發(fā)人員應(yīng)該專注于設(shè)計(jì)良好的業(yè)務(wù)邏輯模型,并且把業(yè)務(wù)邏輯撰寫在模型中。一旦模型設(shè)計(jì)完成之后,MDD即可提供工具自動(dòng)地把業(yè)務(wù)邏輯模型對映到開發(fā)人員使用的技術(shù)中。MDD提供了使用模型來直接引導(dǎo)理解系統(tǒng)、設(shè)計(jì)、建立、部署、動(dòng)作、維護(hù)和修改系統(tǒng)的流程。在這整個(gè)開發(fā)過程中,都是以模型來驅(qū)動(dòng)的。一個(gè)ECO系統(tǒng)的開發(fā)從建立模型、設(shè)計(jì)和開發(fā)模型,到撰寫Delphi/C#程序代碼都與系統(tǒng)模型脫離不了關(guān)系。
2.1.2 UML和OCL
UML(Unified Modeling Language)和OCL(Object Constraint Language)都是由OMG(Object Management Group)定義的標(biāo)準(zhǔn),也都是組成MDD標(biāo)準(zhǔn)的子標(biāo)準(zhǔn)之一, 對MDD的成功具有關(guān)鍵性的作用。ECO開發(fā)中,使用UML來專注于建立業(yè)務(wù)的平臺(tái)無關(guān)模型(Platform Independent Model,PIM),使用OCL來選擇和處理業(yè)務(wù)邏輯對象和業(yè)務(wù)邏輯。
在UML2.0的標(biāo)準(zhǔn)規(guī)范中,OCL是作為附加的語言(Add-on Language)來進(jìn)行面向?qū)ο蠓治?設(shè)計(jì)之用的。由于OCL是附加的UML機(jī)制,所以被用來撰寫業(yè)務(wù)邏輯模型中的業(yè)務(wù)規(guī)則、限制條件以及定義查詢等工作之用。OCL又是一門形式語言,因此使用OCL來定義、撰寫這些模型相關(guān)的信息的好處是既清楚又不會(huì)造成模糊不清的定義。OCL可以取代SQL在ECO應(yīng)用系統(tǒng)中讓開發(fā)人員處理的業(yè)務(wù)邏輯對象,也可使用在ECO類圖中定義的業(yè)務(wù)邏輯,這樣,開發(fā)人員就無須再使用Delphi/C#程序代碼重復(fù)撰寫這些業(yè)務(wù)邏輯,可以說,使用ECO來開發(fā)應(yīng)用系統(tǒng),OCL是除了Delphi/C#語言之外第二個(gè)最重要的語言。
2.1.3 使用ASP.NET之WEB架構(gòu)的ECO應(yīng)用程序
ECO的開發(fā)方式是讓開發(fā)人員設(shè)計(jì)完善的用戶需求業(yè)務(wù)邏輯模型,不僅定義了類、方法和特性,更重要的是它詳細(xì)地定義了一個(gè)應(yīng)用系統(tǒng)中類之間的關(guān)系,這樣一來,開發(fā)人員只需要遵照模型的定義就可以專心地撰寫程序代碼,因此,可以簡單地說ECO能夠達(dá)到“模型即程序,程序即模型”的地步。
ECO 提供了強(qiáng)大的ASP.NET 開發(fā)能力,它能夠和.NET內(nèi)建的UI組件搭配在一起,并且重新整理高階的服務(wù)在一組易于使用的接口中,這樣一來,不但可以讓開發(fā)者非常方便上手,也符合目前面向?qū)ο罂蚣芨臑槭褂媒涌趯?dǎo)向(Interface Oriented)的設(shè)計(jì)架構(gòu)。在這種ECO ASP.NET 架構(gòu)中,除了能夠使用所有ASP.NET提供的各種組件和服務(wù)之外,也能夠使用所有ECO的功能和服務(wù)。ASP.NET 應(yīng)用程序同樣通過EcoSpace 執(zhí)行我們在設(shè)計(jì)時(shí)期設(shè)計(jì)的業(yè)務(wù)邏輯模型,然而,由于ASP.NET 應(yīng)用程序會(huì)有許多客戶端同時(shí)存取使用,因此ASP.NET 應(yīng)用程序需要和后臺(tái)的數(shù)據(jù)庫連接,并需要使用ECO持久化映像同步器(PMapperSynchronizer)來同步每一個(gè)客戶端對于對象的修改,以保證后臺(tái)數(shù)據(jù)庫之中數(shù)據(jù)的一致性。執(zhí)行架構(gòu)如圖1。
2.2 AjaxPro.NET框架
AJAX是Asynchronous JavaScript and XML(異步JavaScript和XML)的縮寫,綜合運(yùn)用Javascript、XHTML和CSS、DOM、XML和XSTL、XMLHttpRequest的技術(shù),AJAX的原則是“按需取數(shù)據(jù)”,可以最大程度的減少冗余請求和響應(yīng)對服務(wù)器造成的負(fù)擔(dān),它使用XMLHTTP對象發(fā)送請求并得到服務(wù)器響應(yīng),在不重新載入整個(gè)頁面的情況下用Javascript操作DOM實(shí)現(xiàn)頁面局部更新,這種更新是瞬間的,從而帶給用戶較好的體驗(yàn)。
隨著Ajax技術(shù)在WEB程序中的應(yīng)用,Ajax框架(或稱Ajax庫)有如雨后春筍般令開發(fā)人員眼花繚亂,但是面對如此之多的Ajax框架,如何選擇適合自己項(xiàng)目的Ajax框架,特別是在和ECO相結(jié)合的應(yīng)用系統(tǒng)中,顯得更為重要。
AjaxPro.NET是一個(gè)優(yōu)秀的Ajax框架,它做為Ajax技術(shù)在.Net框架下的實(shí)現(xiàn),作者M(jìn)ichael Schwarz采取了一種封裝效果相當(dāng)棒的技術(shù):將客戶端處理XML、事件調(diào)用方式都封裝在2個(gè)Javascript文件中(AjaxPro.prototype.js 和AjaxPro.core.js),同時(shí)將這2個(gè)重要文件以資源的形式編譯于dll中,在處理客戶端請求其自定義的.ashx文件時(shí),返回這兩個(gè)文件。在實(shí)際應(yīng)用中只要添加其DLL引用并進(jìn)行簡單的配置, 就可以非常方便的在客戶端直接調(diào)用服務(wù)端方法,實(shí)現(xiàn)驗(yàn)證目的。
2.3 Ajax通過WebService整合ECO系統(tǒng)
ECO功能強(qiáng)大,而且非常符合開發(fā)習(xí)慣,當(dāng)使用ECO開發(fā)應(yīng)用程序時(shí),開發(fā)人員可以專注于設(shè)計(jì)要解決的問題模型,一旦這個(gè)模型定義、開發(fā)完畢之后,整個(gè)應(yīng)用程序就幾乎已經(jīng)完成了大半的工作,因?yàn)镋CO在應(yīng)用程序運(yùn)行時(shí)會(huì)執(zhí)行開發(fā)人員設(shè)計(jì)的模型來解決客戶的問題。這樣開發(fā)人員可以避免花費(fèi)很多的開發(fā)時(shí)間于瑣碎的細(xì)節(jié)之中,而能集中精力于設(shè)計(jì)完善的業(yè)務(wù)邏輯。
Ajax作為構(gòu)建Web應(yīng)用的一種方法,它帶給訪問者完全不同的瀏覽感受,為客戶端提供了強(qiáng)大的GUI能力,通過ECO和AJAX的有機(jī)結(jié)合,開發(fā)人員可以在WEB應(yīng)用程序中使用完善的業(yè)務(wù)邏輯,并將良好的用戶體驗(yàn)展現(xiàn)在使用者面前,那么在ECO與Ajax相結(jié)合的模式下,服務(wù)器端的開發(fā)應(yīng)該是什么樣子,應(yīng)該用什么樣的框架支持這種“只向?yàn)g覽器返回?cái)?shù)據(jù)”的服務(wù)請求,其實(shí)這時(shí)很需要一個(gè)全新概念的服務(wù)器端架構(gòu),本人認(rèn)為這種架構(gòu)應(yīng)該基于WebService。
Web Service主要是為了使原來各孤立的站點(diǎn)之間的信息能夠相互通信、共享而提出的一種接口。Web Service所使用的是Internet上統(tǒng)一、開放的標(biāo)準(zhǔn),如HTTP、XML、SOAP(簡單對象訪問協(xié)議)、WSDL等,所以Web Service可以在任何支持這些標(biāo)準(zhǔn)的環(huán)境(Windows,Linux)中使用。Webservice的一個(gè)最基本的目的就是提供在各個(gè)不同平臺(tái)的不同應(yīng)用系統(tǒng)的協(xié)同工作能力。
通過Web服務(wù),Ajax技術(shù)可以與ECO應(yīng)用程序很好進(jìn)結(jié)合在一起,二者可通過如圖2的模式進(jìn)行相結(jié)合。
3 結(jié)合ECO與Ajax的用戶注冊驗(yàn)證設(shè)計(jì)與實(shí)現(xiàn)
在各種網(wǎng)絡(luò)服務(wù)中,新用戶注冊隨處可見,新用戶進(jìn)行注冊時(shí),系統(tǒng)應(yīng)判斷注冊的用戶名是否已存在,ECO系統(tǒng)中如何在不重新刷新頁面的情況下進(jìn)行驗(yàn)證,就須通過使用Web Service方法。Ajax與ECO相結(jié)合下的用戶注冊驗(yàn)證的實(shí)現(xiàn)主要有以下幾個(gè)步驟:
(1)首先下載AjaxPro.NET 組件。并將AjaxPro.2.dll引用到項(xiàng)目中;
(2)在Web.config文件中配置AjaxPro框架;
(3)使用ECO設(shè)計(jì)器界面以可視化的方式設(shè)計(jì)注冊用戶類(Register類有:UserName、Password、Email等注冊需要的屬性),然后通過ORMapping在連接的數(shù)據(jù)庫中產(chǎn)生必要的數(shù)據(jù)結(jié)構(gòu);
(4)創(chuàng)建ECO WebService,在服務(wù)器端撰寫Web服務(wù)方法;
unit WebService1;
……
[WebMethod]
function GetUserCount(Uname:string): integer;
……
function TWebService1.GetUserCount(Uname:string): integer;
var
OclService: IOclService;
ResultElement: IElement;
oclstr:string;
begin
OclService := EcoSpace.GetEcoService
oclstr:='Register.allinstances->select(UserName='''+Uname+''') ';
ResultElement := OclService.Evaluate(oclstr);
Result := ResultElement.GetAsCollection.Count;
DoneWithEcoSpace;
end;
將調(diào)試后的Web服務(wù)方法通過“Web Reference”添加引用到調(diào)用的項(xiàng)目中。
(5)在ECO ASP.NET Forms中注冊使用Ajax框架,同時(shí)加入相關(guān)的ECO組件,設(shè)計(jì)調(diào)用WebService的方法;
public
function IsNameExist(sUname:string):boolean;
function IsUserExist(Uname:string):boolean;
[AjaxPro.AjaxMethod]
function GetReturnInfo(s:string): string; //聲明客戶端JavaScript可呼叫的方法
[AjaxPro.AjaxMethod]
function GetInfo : string; //聲明客戶端JavaScript可呼叫的方法
……
procedure TRegist.Page_Load(sender: System.Object; e: System.EventArgs);
begin
// TODO: Put user code to initialize the page here
Utility.RegisterTypeForAjax(typeof(Default.TRegist));
end;
function TRegist.IsUserExist(Uname: string): boolean; //調(diào)用WebService
var
ws:TWebService1;
begin
ws:=TWebService1.Create;
if ws.GetUserCount(Uname)>0 then Result:=true else Result:=1;
end;
function TRegist.GetReturnInfo(s: string): string;
begin
if(IsUserExist(s)) then Result:='2';
end;
(6)撰寫客戶端訪問ASPX頁面的JavaScript代碼,使用XMLHttp呼叫Ajax方法。
function IsUsernameExist_callback(res)
{var msg = document.getElementById('lblMessage');
var bRet = res.value;
if (bRet == \"2\")
{msg.innerHTML = '用戶名已存在!';
msg.style.color = ' red ';}
else
{msg.innerHTML = '用戶名可以使用!';
msg.style.color = 'green'}
}
……
4 結(jié)束語
本用戶注冊驗(yàn)證程序在RAD Studio 2007下調(diào)試成功。本文通過這一常用實(shí)例的實(shí)現(xiàn),提出一個(gè)在.NET平臺(tái)下快速開發(fā)Web程序的基本模式:Ajax技術(shù)可以通過WebService和ECO應(yīng)用程序進(jìn)行結(jié)合,充分實(shí)現(xiàn)“快速開發(fā)”與“良好用戶體驗(yàn)”,較好地完成Web應(yīng)用軟件的開發(fā)。
參考文獻(xiàn):
[1] 李維. Delphi MDA/DDA程序設(shè)計(jì)──使用ECO[M]. 電子工業(yè)出版社,2007.
[2] Xavier Pacheco. Delphi for.NET Developer's Guide[M]. 機(jī)械工業(yè)出版社,2005.
[3] 柯自聰. Ajax開發(fā)精要──概念、案例與框架[M]. 電子工業(yè)出版社,2006.
[4] 蔡宏. Delphi 2006 for NET開發(fā)技術(shù)原理與實(shí)踐教程[M]. 電子工業(yè)出版社,2007.
[5] 趙建華. MDA與可執(zhí)行UML[M]. 機(jī)械工業(yè)出版社,2006.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文