深入Atlas系列:Web Sevices Access in Atlas示例(3)
多态是OOP的重要特性,我这里指的多态是其中的一小部分。 在Web Services方法中,我们往往使用的都是一个具体类型的参数。这个参数一般就是一个数据对象,所有的功能基本上只是为了存放数据。虽然这对于应用来说一般已经足够,我们大量使用了这样的Web Servi
多态是OOP的重要特性,我这里指的多态是其中的一小部分。
在Web Services方法中,我们往往使用的都是一个具体类型的参数。这个参数一般就是一个数据对象,所有的功能基本上只是为了存放数据。虽然这对于应用来说一般已经足够,我们大量使用了这样的Web Services,不也过得好好的吗?但是,在这一点上实在太不够面向对象了。
不过,我们到底如何在Web Services方法中运用多态呢?似乎最容易想到的办法就是在Web Services方法里使用接口或者抽象类型的参数,只要将不同的实现或者子类对象作为参数传递给Web Services方法就可以了。作为示例,我们希望看到最简单的东西,那么就使用这个方法吧。
首先,我们定义一个Employee抽象类:
Employee抽象类1 public abstract class Employee<br>2 {<br>3 private int _Years;<br>4 public int Years<br>5 {<br>6 get<br>7 {<br>8 return this._Years;<br>9 }<br>10 set<br>11 {<br>12 this._Years = value;<br>13 }<br>14 }<br>15<br>16 public string RealStatus<br>17 {<br>18 get<br>19 {<br>20 return this.GetType().Name;<br>21 }<br>22 }<br>23<br>24 public abstract int CalculateSalary();<br>25 }
Employee抽象类存放了一个员工的工龄,RealStatus属性返回了当前实例真正的类名,并且定义了一个CalculateSalary方法,可以让子类提供不同的实现。
我们又写了一个Web Services方法CalculateSalary,用于计算一个员工的薪水,并将信息返回。代码如下:
CalculateSalary方法
1 [WebMethod]<br>2 public string CalculateSalary(Employee employee)<br>3 {<br>4 return "I'm " + employee.RealStatus + ", my salary is " + employee.CalculateSalary() + ".";<br>5 }
这样,我们只要传入不同的Employee子类的实例,就能获得不同的信息了。那么我们现在开始分配薪水吧(以下数据纯属虚构,如有雷同,实属巧合)!
首先是实习生。可怜的实习生,不管干多少年永远只有2000元:
Intern类代码
1 public class Intern : Employee<br>2 {<br>3 public override int CalculateSalary()<br>4 {<br>5 return 2000;<br>6 }<br>7 }
接下来是签第三方公司的合同工,底薪5000,每年增加1000:
Vendor类代码
1 public class Vendor : Employee<br>2 {<br>3 public override int CalculateSalary()<br>4 {<br>5 return 5000 + 1000 * (Years - 1);<br>6 }<br>7 }
最后是正式员工(全职工),底薪12000,每年增加2000:
FulltimeEmployee类代码
1 public class FulltimeEmployee : Employee<br>2 {<br>3 public override int CalculateSalary()<br>4 {<br>5 return 12000 + 2000 * (Years - 1);<br>6 }<br>7 }
然后我们应该如何告诉Atlas将不同类型的实例传递给Web Services方法的参数呢?答案便是使用“__serverType”指定类型。我们通过示例代码查看这一点:
首先我们还是来看简单的HTML代码:
HTML代码
1 <scriptmanager id="ScriptManager" runat="server"></scriptmanager><br>2 <br>3 <div>Years:<input type="text" id="txtYears">
</div>
<br>4 <div>
<br>5 Status:<br>6 <select id="comboStatus" style="width:150px;"><br>7 <option value="Jeffz.PolymorphismInWSTypes.Intern">Intern</option>
<br>8 <option value="Jeffz.PolymorphismInWSTypes.Vendor">Vendor</option>
<br>9 <option value="Jeffz.PolymorphismInWSTypes.FulltimeEmployee">FTE</option>
<br>10 </select><br>11 </div>
<br>12 <input type="button" onclick="calculateSalary()" value="Calculate!"><br>13 <h1 id="Result">Result:</h1>
<br>14 <div id="result"></div>
有一个文本框,在里面输入年份。还有一个下拉框,可以选择想要传递给Web Services方法的参数类型。点击“Calculate!”按钮则会调用Web Services方法,并将结果显示在最后的DIV上。
下面是所用到的Javascript代码:
Javascript代码
1 <script language="javascript"><BR>2 function calculateSalary()<BR>3 {<BR>4 var emp = new Object();<BR>5 emp.Years = parseInt($("txtYears").value, 10);<BR>6 emp.__serverType = $("comboStatus").value;<BR>7 <BR>8 Sys.Net.ServiceMethod.invoke(<BR>9 "EmployeeService.asmx",<BR>10 "CalculateSalary",<BR>11 null,<BR>12 { employee : emp },<BR>13 onComplete<BR>14 );<BR>15 }<BR>16 <BR>17 function onComplete(result)<BR>18 {<BR>19 $("result").innerHTML = result;<BR>20 }<BR>21 </script>
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方法
1 [XmlInclude(typeof(Intern))]<br>2 [XmlInclude(typeof(Vendor))]<br>3 [XmlInclude(typeof(FulltimeEmployee))]<br>4 [WebMethod]<br>5 public string CalculateSalary(Employee employee)<br>6 {<br>7 return "I'm " + employee.RealStatus + ", my salary is " + employee.CalculateSalary() + ".";<br>8 }
我们再运行一下页面,先选择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) - 对于复杂数据类型的支持(下)》,可能您会得到比我更深的理解。:)
本文作者:
핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











SQL IF 명령문은 구문을 다음과 같이 조건부로 실행하는 데 사용됩니다. if (조건) 그런 다음 {state} else {state} end if;. 조건은 유효한 SQL 표현식 일 수 있으며 조건이 참이면 당시 조항을 실행하십시오. 조건이 false 인 경우 else 절을 실행하십시오. 명세서를 중첩 할 수있는 경우 더 복잡한 조건부 점검이 가능합니다.

멀티 스레딩의 장점은 특히 많은 양의 데이터를 처리하거나 시간이 많이 걸리는 작업을 수행하기 위해 성능 및 리소스 활용도를 향상시킬 수 있다는 것입니다. 이를 통해 여러 작업을 동시에 수행하여 효율성을 향상시킬 수 있습니다. 그러나 너무 많은 스레드가 성능 저하로 이어질 수 있으므로 CPU 코어 수와 작업 특성에 따라 스레드 수를 신중하게 선택해야합니다. 또한 다중 스레드 프로그래밍에는 교착 상태 및 레이스 조건과 같은 과제가 포함되며 동기화 메커니즘을 사용하여 해결해야하며 동시 프로그래밍에 대한 확실한 지식, 장단점을 측정하고주의해서 사용해야합니다.

Root로 MySQL에 로그인 할 수없는 주된 이유는 권한 문제, 구성 파일 오류, 암호 일관성이 없음, 소켓 파일 문제 또는 방화벽 차단입니다. 솔루션에는 다음이 포함됩니다. 구성 파일의 BAND-ADDRESS 매개 변수가 올바르게 구성되어 있는지 확인하십시오. 루트 사용자 권한이 수정 또는 삭제되어 재설정되었는지 확인하십시오. 케이스 및 특수 문자를 포함하여 비밀번호가 정확한지 확인하십시오. 소켓 파일 권한 설정 및 경로를 확인하십시오. 방화벽이 MySQL 서버에 연결되는지 확인하십시오.

노드 환경에서 403 오류를 반환하는 타사 인터페이스를 피하는 방법. node.js를 사용하여 타사 웹 사이트 인터페이스를 호출 할 때 때때로 403 오류를 반환하는 문제가 발생합니다. � ...

Vue Axios의 크로스 도메인 문제를 해결하는 방법 : Cors 플러그인을 사용하여 Websocket을 사용하여 JSONP를 사용하여 Axios 프록시를 사용하여 서버 측의 CORS 헤더 구성

EasyWechat5.5에서 구성 요소를 얻으십시오 ...

Apache에서 Zend를 구성하는 방법은 무엇입니까? Apache 웹 서버에서 Zend 프레임 워크를 구성하는 단계는 다음과 같습니다. Zend 프레임 워크를 설치하고 웹 서버 디렉토리로 추출하십시오. .htaccess 파일을 만듭니다. Zend 응용 프로그램 디렉토리를 작성하고 Index.php 파일을 추가하십시오. Zend 응용 프로그램 (application.ini)을 구성하십시오. Apache 웹 서버를 다시 시작하십시오.

이 기사는 데비안 시스템에서 Apache Logs를 분석하여 웹 사이트 성능을 향상시키는 방법을 설명합니다. 1. 로그 분석 기본 사항 Apache Log는 IP 주소, 타임 스탬프, 요청 URL, HTTP 메소드 및 응답 코드를 포함한 모든 HTTP 요청의 자세한 정보를 기록합니다. 데비안 시스템 에서이 로그는 일반적으로 /var/log/apache2/access.log 및 /var/log/apache2/error.log 디렉토리에 있습니다. 로그 구조를 이해하는 것은 효과적인 분석의 첫 번째 단계입니다. 2. 로그 분석 도구 다양한 도구를 사용하여 Apache 로그를 분석 할 수 있습니다.
