本文属张友邦(SpanZhang)原创,转载请注明出处。
Flash AS2在使用.NET进行数据访问的时候很方便,如果进行一定程度的包装,可以使得这个模型更加清晰和易于使用。下面是我在开发一个WEB RIA应用的时候开发出来的一套访问模型。
1、Flash端:1.1、EventObject.asimport mx.events.EventDispatcher;import mx.remoting.*;import mx.rpc.*;
class span.EventObject { public var addEventListener:Function; public var removeEventListener:Function; private var dispatchEvent:Function; public function EventObject() { EventDispatcher.initialize(EventObject.prototype); } private function dispatchDataEvent(strEventName:String, eventReturned:Object) { var eventObj:Object = {type:strEventName, target:this, eventName:strEventName}; if (eventReturned.result != null) { eventObj.eventParam = eventReturned.result; eventObj.success = true; } if (eventReturned.fault != null) { eventObj.eventParam = eventReturned.fault.faultstring; eventObj.success = false; } dispatchEvent(eventObj); } private function dispatchSimpleEvent(strEventName:String, objEventParam:Object) { var eventObj:Object = {type:strEventName, target:this, eventParam:objEventParam}; dispatchEvent(eventObj); }}
这个类是对Flash事件机制的进一步封装,以便简化实际使用中的调用程序。
1.2、DataProxy.asimport mx.events.EventDispatcher;import mx.remoting.*;import mx.rpc.*;
class span.DataProxy extends span.EventObject { private var dataService:Service; public function DataProxy() { super(); var urlArray:Array = _root._url.split("/"); var strUrl:String = urlArray[2].toLowerCase(); dataService = new Service("http://" + strUrl + "/data/gateway.aspx", null, "data"); } private function dummyFunction():Void{ } private function invokeData(pendingCall:PendingCall, callbackFunction:String) { if (callbackFunction == null || callbackFunction.length <= 0) pendingCall.responder = new RelayResponder(this, "dummyFunction", "dummyFunction"); else pendingCall.responder = new RelayResponder(this, callbackFunction, callbackFunction); }}
这个类是一个基本的数据代理接口,它是配置.NET的gateway地址的唯一地方。
1.3、HeartBeat.as/*
Author: Span Time: 11/16, 2006 Description: This component is designed as singleton for global use.
*/
import span.DataProxy;
class pub.HeartBeat extends span.DataProxy{ private static var heartBeat:HeartBeat; private var timerId:Number; private var isChecking:Boolean; public static function instance():HeartBeat { if (heartBeat == null) heartBeat = new HeartBeat; return heartBeat; } public function stopBeat():Void{ if (timerId > 0) { clearInterval(timerId); timerId = -1;
}
} private function HeartBeat() { super(); isChecking = false; doHeartBeat(); timerId = setInterval(this, "doHeartBeat", 10 * 1000); } private function doHeartBeat() { if (isChecking) return; isChecking = true; invokeData(dataService.pub_heartBeat(), "doHeartBeatReturned"); }
private function doHeartBeatReturned(eventReturned:Object) { if (eventReturned == null || eventReturned.result == undefined) { dispatchSimpleEvent("heartBeatFailed"); } else { if (eventReturned.result == "1") dispatchSimpleEvent("heartBeatSuccess"); else dispatchSimpleEvent("heartBeatFailed"); } isChecking = false; }}
这个类是一个应用类,它是数据访问的实现类。
2、.NET服务器端(C#)2.1、Public.csusing System;using System.Data;using System.Data.SqlClient;using System.Configuration;using System.Collections;using System.ComponentModel;using System.Web;using System.Web.UI.WebControls;using System.Data.Common;using System.Text;using System.Web.SessionState;
namespace System{ public enum NCENUM_LANG_TYPE //语言类型 { zhcn = 0, zhtw = 1, en = 2 }
public enum NCENUM_FLASH_RESULT_TYPE { STRING = 0, STRING_ARRAY = 1, RECORDSET = 2, RECORDSET_ARRAY = 3 }
public class Public { public static void ExecFlashSql(ref FlashGateway.Flash flash, string strSql, NCENUM_FLASH_RESULT_TYPE retType) { if (flash == null) flash = new FlashGateway.Flash();
flash.Result = null;
DataSet ds = ncDB.ExecDataSet(strSql); if (ds == null || ds.Tables.Count <= 0) return;
switch (retType) { case NCENUM_FLASH_RESULT_TYPE.STRING: { if (ds.Tables[0].Rows.Count > 0) flash.Result = ds.Tables[0].Rows[0][0].ToString(); } break;
case NCENUM_FLASH_RESULT_TYPE.STRING_ARRAY: { DataRow dr = ds.Tables[0].Rows[0]; int colLen = ds.Tables[0].Columns.Count; string[] result = new string[colLen]; for (int i = 0; i < colLen; ++i) result[i] = dr[i].ToString();
flash.Result = result; } break;
case NCENUM_FLASH_RESULT_TYPE.RECORDSET: { if (ds.Tables[0].Rows.Count > 0) flash.Result = ds.Tables[0]; } break;
case NCENUM_FLASH_RESULT_TYPE.RECORDSET_ARRAY: { int tabLen = ds.Tables.Count; DataTable[] result = new DataTable[tabLen]; for (int i = 0; i < tabLen; ++i) result[i] = ds.Tables[i];
flash.Result = result; } break; } } }}
这个文件扩展了System命名空间,增加了Flash数据访问的相应支持。
2.2、HeartBeat.aspx.csusing System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;
namespace Project{ /// <summary> /// Summary description for HeartBeat. /// </summary> public class HeartBeat : System.Web.UI.Page { protected FlashGateway.Flash flash = new FlashGateway.Flash(); private void Page_Load(object sender, System.EventArgs e) { Public.ExecFlashSql ( ref flash, "exec dbo.p_sm_heartBeat '" + Session.SessionID + "'", NCENUM_FLASH_RESULT_TYPE.STRING ); }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion }}
