本文属张友邦(SpanZhang)原创,转载请注明出处。
Flash AS2在使用.NET进行数据访问的时候很方便,如果进行一定程度的包装,可以使得这个模型更加清晰和易于使用。下面是我在开发一个WEB RIA应用的时候开发出来的一套访问模型。
1、Flash端:
1.1、EventObject.as
import 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.as
import 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.cs
using 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.cs
using 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
}
}