科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件开发基于接口的.NET Web服务

开发基于接口的.NET Web服务

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

建立基于接口的互联网服务可以使我们在改变很少或基本不改变客户端代码的情况下,很方便地更换服务提供商……

作者:刘彦清编译 来源:yesky 2007年11月17日

关键字: 软件

  • 评论
  • 分享微博
  • 分享邮件
客户端软件需要添加一个对接口类型描述的引用和实现它的类,可以用下面二种方法之一添加接口引用,第一种方法是使用WSDL.exe命令行工具。通过使用/server开关,可以让WSDL.exe生成一个符合互联网服务描述的纯抽象类。假设接口描述在http://www.CalculationServices.com/ICalculator.asmx,用下面的格式运行WSDL.exe工具:

WSDL.exe /server /out: ICalculatorDef.cs
http://www.CalculationServices.com/ICalculator.asmx

  然后在客户端工程中添加ICalculatorDef.cs源文件。

  即使.NET知道该接口,/server开关生成一个带有抽象方法的纯抽象类:

public abstract class ICalculator : WebService
{
 [WebMethod]
 [SoapDocumentMethodAttribute("http://CalculationServices.com/Add"]
 public abstract int Add(int num1, int num2);
 // ICalculator方法的其余部分
}

  我们需要的是接口定义。打开ICalculatorDef.cs文件,删除WebService基本类,并把ICalculator的描述由抽象类改为接口,删除ICalculator类和其方法的所有属性以及所有方法中的public和abstract修饰符。经过这样的处理后,我们就得到了最原始的接口定义。

  第二种方法是,客户端应用导入接口定义:在ICalculator服务中添加一个Web引用,然后从包装类中解析出接口的方法,将Add Web Reference向导指向含有接口定义的站点,就可以实现这一目的。此操作会生成一个被称为ICalculator的包装类,该类能够利用ICalculator原有的方法和互联网服务包装类的其他方法。用户只需要接口的方法定义即可,因此可以删除掉接口方法的实体和包括构造器在内的其他方法。删除接口方法中的SoapClientProtocol基本类和public修饰符,删除所有方法和类的属性。最后,将ICalculator的定义由类改为接口。这样,客户端应用就有了最原始的接口描述。

  第二步,客户端应用必须包含一个对实现接口的互联网服务的Web引用。再次使用 Add Web Reference向导将向导指向这些实现驻留的站点。在本例中,VS.NET生成了这些实现的包装类━━SimpleCalculator和ScientificCalculator。这些机器生成的包装类与与ICalculator无关,为了使ICalculator具有多态性,可以添加一个它的导出类。SimpleCalculator和ScientificCalculator如表5所示:

public class SimpleCalculator : SoapHttpClientProtocol, ICalculator
{
 public SimpleCalculator()
 {
  Url ="http://www.CalculationServices.com
     /SimpleCalculator.asmx";
 }

 [SoapDocumentMethod("http://CalculationServices.com/Add")]
 public int Add(int num1,int num2)
 {
  object[] results = Invoke("Add", new object[]{num1,num2});
  return (int)(results[0]);
 }
 file://Other method wrappers
 }


 public class ScientificCalculator : SoapHttpClientProtocol, ICalculator
 {
  public ScientificCalculator()
  {
   Url = "http://www.CalculationServices.com/
       ScientificCalculator.asmx";
  }

[SoapDocumentMethod("http://CalculationServices.com/Add")]
public int Add(int num1,int num2)
{
 object[] results = Invoke("Add", new object[]{num1,num2});
 return (int)(results[0]);
}
 file://Other method wrappers
}

  在使用Add Web Reference向导生成包装类后,将它们修改成基于接口的类。

  下面是一个客户端设计模板:ICalculator提供了服务定义。互联网服务的位置是由通过继承得来的SimpleCalculator或ScientificCalculator生成的,包装类知道如何转发对互联网应用的调用,但并不清楚它在服务器端的具体实现,SimpleCalculator和ScientificCalculator之间的所有区别只不过是它们封装的服务地址或者提供商不同而已。

  在有了上面的基础之后,我们就可以编写基于接口的、多态性的互联网服务应用。如果仔细观察,我们还会发现一个有趣的现象:站在客户端应用的角度来看,服务的位置━━URL是一个对象。

  在未来数年内,互联网服务将成为几乎每个编程人员职业生涯中不可或缺的一部分,然而,与我们在intranet上已经熟悉的面向组件的编程和现有的设计方法学相比,互联网服务的支持工具还是相当不成熟的,目前最大的挑战是如何把二者结合起来。我希望这篇文章使你能够不要因为VS.NET不支持就放弃一些成熟和很好的理念,通过把二者结合起来或者能够对URL与对象相同有一个正确的认识,我们完全可以把一些成熟的理念应用在崭新的领域。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章