Hello World
Spiga

深入Atlas系列:Web Sevices Access in Atlas示例(3) - 在Web Services方法中使用多态

2006-10-18 11:06 by 老赵, 2564 visits
  多态是OOP的重要特性,我这里指的多态是其中的一小部分。

在Web Services方法中,我们往往使用的都是一个具体类型的参数。这个参数一般就是一个数据对象,所有的功能基本上只是为了存放数据。虽然这对于应用来说一般已经足够,我们大量使用了这样的Web Services,不也过得好好的吗?但是,在这一点上实在太不够面向对象了。

不过,我们到底如何在Web Services方法中运用多态呢?似乎最容易想到的办法就是在Web Services方法里使用接口或者抽象类型的参数,只要将不同的实现或者子类对象作为参数传递给Web Services方法就可以了。作为示例,我们希望看到最简单的东西,那么就使用这个方法吧。

首先,我们定义一个Employee抽象类:
Employee抽象类

Employee抽象类存放了一个员工的工龄,RealStatus属性返回了当前实例真正的类名,并且定义了一个CalculateSalary方法,可以让子类提供不同的实现。

我们又写了一个Web Services方法CalculateSalary,用于计算一个员工的薪水,并将信息返回。代码如下:
CalculateSalary方法

这样,我们只要传入不同的Employee子类的实例,就能获得不同的信息了。那么我们现在开始分配薪水吧(以下数据纯属虚构,如有雷同,实属巧合)!

首先是实习生。可怜的实习生,不管干多少年永远只有2000元:
Intern类代码

接下来是签第三方公司的合同工,底薪5000,每年增加1000:
Vendor类代码

最后是正式员工(全职工),底薪12000,每年增加2000:
FulltimeEmployee类代码

然后我们应该如何告诉Atlas将不同类型的实例传递给Web Services方法的参数呢?答案便是使用“__serverType”指定类型。我们通过示例代码查看这一点:

首先我们还是来看简单的HTML代码:
HTML代码

有一个文本框,在里面输入年份。还有一个下拉框,可以选择想要传递给Web Services方法的参数类型。点击“Calculate!”按钮则会调用Web Services方法,并将结果显示在最后的DIV上。

下面是所用到的Javascript代码:
Javascript代码

calculateSalary函数会构造一个Object作为Web Services方法的参数,设置它的“Years”之后,还会将下拉框选择的那项赋值给“__serverType”。这样,“__serverType”的值就是一个类的FullName了,于是也就告诉了Atlas在服务器端需要构造哪个类的实例。

打开页面:


在文本框内填入工龄,选择Status,并点击“Calculate!”按钮。咦?怎么出错了?


为什么会出现这个错误?因为Atlas的服务器端Web Services运行环境没有在其上下文的字典里找到Jeffz.PolymorphismInWSTypes.Vendor这个类,于是抛出了KeyNotFoundException。那么我们该如何解决这个问题呢?这时候XmlIncludeAttribute就登场了,它原本是配合XmlSerializer使用,而现在也大有用武之地。

我们只需使用XmlIncludeAttribute为CalculateSalary这个Web Services方法作标记就可以了,例如:
应用了XmlIncludeAttribute的CalculateSalary方法

我们再运行一下页面,先选择Intern,输入工龄为2,点击“Calculate!”按钮:


再选择FTE,输入工龄为5,点击“Calculate!”按钮:


可以发现,我们在客户端告诉了Atlas应该使用哪个类,而Atlas也老老实实地构造了相应的类。如果能够合理地使用这一点,我们能够做的事情何止这个示例写的这么简单!

从这里我们可以看出,虽然Atlas打着“使用Web Services”的名号,但是它事实上使用一套特别的运行环境。如果利用好这个运行环境的特性,我们的Atlas开发生活会变得更加美好。:)



注一:如果一个Web Service类有多个Web Service方法,只需在一个方法上使用XmlInclude来标注类A,则所有该类的方法都能够使用类A,因为那些方法都在同一个Web Service上下文中。不过,不同的Web Services类使用了不同的上下文。

注二:对于Atlas有关这部分功能的实现方式以及代码分析感兴趣的朋友,可参考本人之前的文章《深入Atlas系列:Web Sevices Access in Atlas(6) - 对于复杂数据类型的支持(下)》,可能您会得到比我更深的理解。:)



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

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

10 条回复

  1. 老赵
    admin
    链接

    老赵 2006-10-18 11:14:00

    嗯,这个例子比较简单但是我觉得这个特性很好用……

  2. mill[未注册用户]
    *.*.*.*
    链接

    mill[未注册用户] 2006-10-18 11:58:00

    学习中...,支持一下.

  3. 老赵
    admin
    链接

    老赵 2006-10-18 12:52:00

    @mill
    我想问一下,您希望看到什么样的示例呢?

  4. mill[未注册用户]
    *.*.*.*
    链接

    mill[未注册用户] 2006-10-18 15:44:00

    希望看到的示例还未想好,现在先争取好好研究您的文章!

  5. 老赵
    admin
    链接

    老赵 2006-10-18 17:34:00

    @mill
    多谢支持。:)
    不过发现现在似乎关注Atlas的人不多了……

  6. mill[未注册用户]
    *.*.*.*
    链接

    mill[未注册用户] 2006-10-18 20:12:00

    偶想关注Atlas的人不会少的......

    另外,请教一下:除了在本地机运行Atlas之外,那些虚拟主机服务商提供好的
    支持ASP.NET2.0空间?您用的那里的空间?偶用的中国频道www.china-channel.com的,只支持ASP.NET1.1的。

    如果有了空间,就有的动力与想象力了......

    能在ASP.NET1.1上模拟支持Atlas吗?瞎想了, 估计远不如购买2.0的空间来的
    划算!

  7. 老赵
    admin
    链接

    老赵 2006-10-18 22:41:00

    @mill
    我是使用了国外的WebSecureStore,ASP.NET 2.0 + SQL Server 2005。
    国内的话我朋友的网站是Host在国内的,也是ASP.NET 2.0 + 2005,要不我帮您留意一下?
    至于1.1上是不可能运行Atlas服务器端的,因为Atlas整个程序集是使用.NET 2.0开发和执行的。:)

  8. 小蜗牛
    *.*.*.*
    链接

    小蜗牛 2006-10-18 23:55:00

    我还是看不懂:((

  9. 暮松
    *.*.*.*
    链接

    暮松 2006-10-19 06:29:00

    @Jeffrey Zhao
    呵呵,其实还是很多的,只是大家都在潜水罢了

  10. 老赵
    admin
    链接

    老赵 2006-10-19 09:51:00

    @暮松
    呵呵……不过每个示例基本上只有10多人下载,这个是事实……:)

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我