当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  深入Atlas 系列之客户端支持 1

 深入Atlas 系列之客户端支持 1

点击次数:19 次 发布日期:2008-11-26 11:09:10 作者:源代码网
源代码网推荐      Atlas提供了强大而灵活的服务器端Web Services访问能力。这对于客户端AJAX开发提供了绝好的条件,这几乎也是任何AJAX框架必备的功能。因为只要有了它,就能轻松地以AJAX方式与服务器端进行交互,而其他多样的页面操作自然可以由开发人员尽情开发。对于部分喜欢自己动手的开发人员来说,这甚至是他们仅仅需要的支持。
源代码网推荐  
源代码网推荐    从这篇文章开始,我会从实现角度剖析Atlas对于Web Services的支持,希望能够帮助大家更深入地理解,更灵活地使用Atlas提供的这一功能。
源代码网推荐  
源代码网推荐    在Atlas中,对于Web Services的访问,其实都是通过Sys.net.ServiceMethod类来实现的。我们先通过UML来看一下Sys.Net.ServiceMethod以及其其他一些类的关系。
源代码网推荐  
源代码网推荐  
源代码网推荐  Sys.Net.WebMethod类是Sys.Net.ServiceMethod和Sys.Net.PageMethod的父类。后者用于访问写于页面中使用WebMethodAttribute标注的方法,不在这篇文章的讨论范围内。Sys.Net.WebMethod内定义了五个抽象函数:get_methodName、addHeaders、get_url、get_body和get_appUrl,其作用应该相当地显而易见。而继承Sys.Net.WebMethod的类,例如Sys.Net.ServiceMethod,则提供了这五个抽象函数的实现。
源代码网推荐  
源代码网推荐    Sys.Net.WebMethod类有一个非常有趣的函数“invoke”。从UML图中会发现,它居然提供了一个JavaScript中没有的功能:“函数重载(overload)”!至于它是如何实现,该如何使用,稍后将结合代码进行详细介绍。
源代码网推荐  
源代码网推荐    那么就进入代码分析阶段,先从Sys.Net.WebMethod的结构看起,从一个Atlas类的大致结构可以看出该类的成员定义和“构造函数”的实现。
源代码网推荐  
源代码网推荐    Sys.Net.WebMethod结构:
源代码网推荐  
源代码网推荐  1 Sys.Net.WebMethod = function() {
源代码网推荐  2  //抽象成员定义
源代码网推荐  3  this.addHeaders = Function.abstractMethod;
源代码网推荐  4  this.get_appUrl = Function.abstractMethod;
源代码网推荐  5  this.get_url = Function.abstractMethod;
源代码网推荐  6  this.get_body = Function.abstractMethod;
源代码网推荐  7
源代码网推荐  8  //最后这个定义是我补上的,很明显代码里缺少了这个定义
源代码网推荐  9  this.get_methodName = Function.abstractMethod;
源代码网推荐  10
源代码网推荐  11  this.invoke = function(params) {
源代码网推荐  12   ……
源代码网推荐  13  }
源代码网推荐  14
源代码网推荐  15  this._invoke = function(params, onMethodComplete, onMethodTimeout,
源代码网推荐  16 onMethodError, onMethodAborted, userContext, timeoutInterval, priority, useGetMethod) {
源代码网推荐  17
源代码网推荐  18   ……
源代码网推荐  19
源代码网推荐  20   function onComplete(response, eventArgs) {
源代码网推荐  21    ……
源代码网推荐  22   }
源代码网推荐  23
源代码网推荐  24   function onTimeout(request, eventArgs) {
源代码网推荐  25    ……
源代码网推荐  26   }
源代码网推荐  27
源代码网推荐  28   function onAborted(request, eventArgs) {
源代码网推荐  29    ……
源代码网推荐  30   }
源代码网推荐  31
源代码网推荐  32   ……
源代码网推荐  33  }
源代码网推荐  34 }
源代码网推荐  35 Sys.Net.WebMethod.reGISterAbstractClass("Sys.Net.WebMethod");
源代码网推荐  
源代码网推荐    可以见到五个抽象函数定义,在this._invoke函数是真正产生请求的地方,里面还有数个用于引发事件的方法。整个类的结构非常简单。
源代码网推荐  
源代码网推荐    接下来我们来仔细分析一下this.invoke函数。
源代码网推荐  
源代码网推荐    this.invoke函数分析
源代码网推荐  
源代码网推荐  1 // 参数params是一个Dictionary,用key - value的方式
源代码网推荐  2 // 保存即将传递给Web Services的参数
源代码网推荐  3 this.invoke = function(params) {
源代码网推荐  4  var numOfParams = arguments.length;
源代码网推荐  5
源代码网推荐  6  // 如果有两个参数,并且第二个参数不是一个函数,
源代码网推荐  7  // 则说明函数调用时参数是这样的:
源代码网推荐  8  // this.invoke(params, settings);
源代码网推荐  9  if (numOfParams == 2 && arguments[1] && typeof(arguments[1]) != "function") {
源代码网推荐  10
源代码网推荐  11  // 构造一个数组,用于获得每个key的index
源代码网推荐  12  var expectedParamNames =
源代码网推荐  13   ["onMethodComplete", "onMethodTimeout", "onMethodError",
源代码网推荐  14   "onMethodAborted", "userContext", "timeoutInterval",
源代码网推荐  15   "priority", "useGetMethod"];
源代码网推荐  16
源代码网推荐  17  // 传入的第二个参数settings
源代码网推荐  18  var paramContainer = arguments[1];
源代码网推荐  19
源代码网推荐  20  // 将要传递给this._invoke函数的参数数组
源代码网推荐  21  var newParams = new Array(expectedParamNames.length + 1);
源代码网推荐  22  // 第一个参数就是params
源代码网推荐  23  newParams[0] = params;
源代码网推荐  24
源代码网推荐  25  // 枚举settings的每个key
源代码网推荐  26  for (var paramName in paramContainer) {
源代码网推荐  27   // 由于传递给this._invoke时参数需要按照顺序顺序,
源代码网推荐  28   // 所以必须获得当前key的index。
源代码网推荐  29   var index = expectedParamNames.indexOf(paramName);
源代码网推荐  30
源代码网推荐  31   // 如果setting里有个key是不需要的,那么抛出Error
源代码网推荐  32   if (index < 0) {
源代码网推荐  33    throw Error.createError(
源代码网推荐  34     String.format(
源代码网推荐  35      ""{0}" is not a valid argument. It should be one of {1}",
源代码网推荐  36      paramName, expectedParamNames
源代码网推荐  37     )
源代码网推荐  38    );
源代码网推荐  39   }
源代码网推荐  40
源代码网推荐  41   // 将参数放在数组合适的位置上
源代码网推荐  42   newParams[index + 1] = paramContainer[paramName];
源代码网推荐  43  }
源代码网推荐  44
源代码网推荐  45  // 将准备好的参数数组传递给this._invoke调用
源代码网推荐  46  return this._invoke.apply(this, newParams);
源代码网推荐  47 }
源代码网推荐  48
源代码网推荐  49 // 还有一种调用方式的参数和this_invoke的参数完全相同
源代码网推荐  50 return this._invoke.apply(this, arguments);
源代码网推荐  51 }
源代码网推荐  
源代码网推荐    可以看到,这就是就是this.invoke“函数重载(overload)”的实现方式。到底是故意如此设计还是在后续开发时为了兼容,可能就不得而知了。不过也就是说,我们现在有中参数传递可以使用。
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华