老赵点滴


  先做人,再做技术人员,最后做程序员。
  我的理想:“让外国人看中国人写的技术书籍和文章”。Try as I might
posts - 293, comments - 11089, trackbacks - 167, articles - 6
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
  在上一个示例《深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法》中我们了解到如何通过HTTP GET来访问Web Services方法。很显然,使用HTTP GET依靠Query String传递参数,于是在客户端拿到的总是基本数据类型String。幸好,在Atlas中,对于基础类型的参数,如果遇到了一个字符串,则会设法将其转换成一个合适的类型。因此,在使用HTTP GET方法传递参数时,在Web Services方法里能够使用个中各样的基础类型。

  但是,这显然远远不够,Atlas也不会将这个问题置之不理。在Atlas中,自提供了一套自定义机制可以将基础类型转换为复杂类型。在《深入Atlas系列:Web Sevices Access in Atlas示例(2) - 自定义JavaScriptConverter处理循环引用对象》里我们知道了依靠自定义JavaScriptObject类可以为一个或一系列的类提供自定的序列化和反序列化的功能。在现在这片文章中,我将使用示例演示一下如何使用TypeConverter自定义基础类型到复杂类型的转换(请注意,这个方法是提供了基础类型向复杂类型转换的功能,在使用HTTP POST传递Web Services参数时也能使用)。在某些最简单的需求下,就可以使用这个方法,它比自定义一个JavaScriptObject相对要方便一些。

  TypeConverter对于编写ASP.NET Server Control的朋友可谓是再熟悉不过了。我们通过示例,一步一步地来查看如何在Atlas中使用自定义TypeConverter。

  首先,定义一个复杂类型Employee:
Employee类

  可以看到,我们使用了TypeConverterAttribute将稍后会讲解的EmployeeConverter关联到Employee上。

  接着,和上一个例子一样,我们写一个支持HTTP GET访问的Web Services方法,只是参数使用了复杂类型。
HttpGetEmployeeService

  然后是所需的Xslt文件:
Employee.xsl

  上面这些对于看过之前一片文章的朋友们来说应该很熟悉。接下来,我们就进入正题,定义一个EmployeeConverter。代码如下:
EmployeeConverter类

  EmployeeConverter继承了TypeConverter,首先覆盖CanConvertFrom方法表明使用EmployeeConverter可以将一个String转换成另一个对象。接着在覆盖ConvertFrom方法,将传入的value值转换为一个复杂对象Employee。这里为了方便,我们把Employee对象在客户端JOSN序列化,然后在服务器端再序列化回来,事实上,这种基础类型到复杂类型的转换,完全可以使用任何方式。

  代码都非常简单,也容易理解,因此我们直接看一下使用代码。由于代码很少,就将Javascript和HTML一并贴出了:
Javascript和HTML代码

  在奠基“Submit”按钮之后,会调用submitEmployee函数,这个函数根据用户的输入构造一个Employee对象,然后再使用和上一篇文章相同的办法拼接URL,最后使用window.open打开。

  我们来看一下使用效果,首先是刚打开窗口:


  输入内容并点击Submit,注意新窗口中的地址栏信息:


  这个示例就到此为止了,这个就是自定义TypeConverter的使用。

  事实上,正如前面我提到的,完全可以不使用JSON方式来传递对象。个人认为,TypeConverter最大的作用是可以隐藏一个复杂类型的细节,例如我们将用户认证信息加密后传输到客户端,然后客户端使用字符串形式传递给一个Web Services方法,然后使用自定义TypeConverter获得解密后的对象,这样就可以安全地传递信息。

  不过,有了JavaScriptObject和TypeConverter,我们该如何选择呢?根据我的理解,在选择时,我们可以这样判断:

1、如果需要隐藏复杂类型细节,则使用TypeConverter。
2、如果需要在客户端提供代理,则使用JavaScriptObject。
3、如果需要扩展已有的类,使用JavaScriptObject。
4、如果无法确定用哪种扩展机制,使用自定义JavaScriptObject。



  点击这里下载示例源代码。

Feedback

#1楼    回复  引用  查看    

2006-10-19 14:14 by 小蜗牛      
哦@。@还是支持一下。

#2楼 [楼主]   回复  引用  查看    

2006-10-19 14:15 by Jeffrey Zhao      
@小蜗牛
示例大都太简单了其实……

#3楼    回复  引用    

2006-10-19 17:37 by 哈哈[匿名] [未注册用户]
进来感谢一下,
还是看示例好啊,不用动脑子:)

#4楼 [楼主]   回复  引用  查看    

2006-10-19 17:40 by Jeffrey Zhao      
@哈哈[匿名]
不过这种东西不看代码还真的不会知道。所以写示例比写分析轻松太多了。:)

#5楼    回复  引用  查看    

2006-11-04 01:40 by MK2      
Web Sevices 究竟支持那些 C#类型的?怎么DataTable都序列化有问题的```晕了啊````

#6楼 [楼主]   回复  引用  查看    

2006-11-04 01:50 by Jeffrey Zhao      
@MK2
理论上能支持所有的类型。只是对于像DataTable这样的复杂类型(主要是有循环引用),需要指定一个JavaScriptConverter。在CTP的ATALS中已经指定了与DataSet,DataTable和DataRow对应的JavaScriptConveter,而RTM中则没有了,如果现在需要的话则需要自己写。:)




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: