深入Atlas 系列之客户端支持 1
点击次数:19 次 发布日期:2008-11-26 11:09:10 作者:源代码网
|
源代码网推荐 源代码网推荐 从这篇文章开始,我会从实现角度剖析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)。 源代码网推荐 源代码网供稿. |
