0

0

深入Atlas系列:Web Sevices Access in Atlas示例(3)

php中文网

php中文网

发布时间:2016-06-07 15:17:15

|

1498人浏览过

|

来源于php中文网

原创

多态是OOP的重要特性,我这里指的多态是其中的一小部分。 在Web Services方法中,我们往往使用的都是一个具体类型的参数。这个参数一般就是一个数据对象,所有的功能基本上只是为了存放数据。虽然这对于应用来说一般已经足够,我们大量使用了这样的Web Servi


 

  多态是OOP的重要特性,我这里指的多态是其中的一小部分。

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

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

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

  Employee抽象类1 public abstract class Employee
2 {
3   private int _Years;
4   public int Years
5   {
6     get
7     {
8       return this._Years;
9     }
10     set
11     {
12       this._Years = value;
13     }
14   }
15
16   public string RealStatus
17   {
18     get
19     {
20       return this.GetType().Name;
21     }
22   }
23
24   public abstract int CalculateSalary();
25 }

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

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

CalculateSalary方法

1 [WebMethod]
2 public string CalculateSalary(Employee employee)
3 {
4   return "I'm " + employee.RealStatus + ", my salary is " + employee.CalculateSalary() + ".";
5 }

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

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

  Intern类代码

1 public class Intern : Employee
2 {
3   public override int CalculateSalary()
4   {
5     return 2000;
6   }
7 }

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

  Vendor类代码

1 public class Vendor : Employee
2 {
3   public override int CalculateSalary()
4   {
5     return 5000 + 1000 * (Years - 1);
6   }
7 }

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

  FulltimeEmployee类代码

1 public class FulltimeEmployee : Employee
2 {
3   public override int CalculateSalary()
4   {
5     return 12000 + 2000 * (Years - 1);
6   }
7 }

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

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

HTML代码

你好星识
你好星识

你的全能AI工作空间

下载

1
2  
3

Years:

4

5   Status:
6  
11

12
13

Result:


14

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

  下面是所用到的Javascript代码:

  Javascript代码

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

 打开页面:

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

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

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

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

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

  应用了XmlIncludeAttribute的CalculateSalary方法

1 [XmlInclude(typeof(Intern))]
2 [XmlInclude(typeof(Vendor))]
3 [XmlInclude(typeof(FulltimeEmployee))]
4 [WebMethod]
5 public string CalculateSalary(Employee employee)
6 {
7   return "I'm " + employee.RealStatus + ", my salary is " + employee.CalculateSalary() + ".";
8 }
  我们再运行一下页面,先选择Intern,输入工龄为2,点击“Calculate!”按钮:

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

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

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

  可以发现,我们在客户端告诉了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) - 对于复杂数据类型的支持(下)》,可能您会得到比我更深的理解。:)

本文作者:

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

63

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

20

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

49

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

11

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.7万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号