WCF分布式开发步步为赢(5)服务契约与操作重载

   【1】重载概念:

   【1.1】什么是重载(OverLoad):

    所谓重载是指同一个方法名可以对应着多个方法的实现。这些方法的名字相同,但是方法的参数的类型不同。这就是方法重载的概念。函数方法类和对象的应用尤其重要。

  方法重载要求编译器能够唯一地确定调用一个方法时应执行哪个方法代码,即采用哪个方法实现。确定方法实现时,要求从方法参数的个数和类型上来区分。这就是说,进行方法重载时,要求同名方法在参数个数上不同,或者参数类型上不同。否则,将无法实现重载。
    关于重载一定要注意:重载方法的参数类型和参数个数一定要不同(即:要么参数的类型不同,要么参数的个数不同,要么参数的类型和个数都不同),否则,编译器就不知道该调用那个方法了。

    方法重载的好处就是相同的方法,带来不同的结果和实现,这里我们可以根据传递参数的不同来决定调用的方法。这是编译时多态的一种实现机制。

   【1.2】C#类方法重载示例:

    我们这里给出一个简单的c#语言实现的方法重载的列子,这里对于SayHelloOverLoading方法,同一个类里给出的三个方法的参数个数不同。内部实现也不同。具体代码如下:

//3.面向对象里的类,如何实现操作重载,和WCF服务类里的操作重载做对比
    public class ClassOverLoading
    {
        
public ClassOverLoading()
        { 

        }
        
//掩饰方法重载,分别实现三个方法,C#等面向对象的语言提供了方法重载机制的支持。
        public string SayHelloOverLoading()
        { 
            
//编写代码
            return "Hello,This an C# class overloading demo";
        }
        
//类里的方法重载不需要别名
        public string SayHelloOverLoading(string name)
        {
            
//编写代码
            return "Hello:" + name + "This an C# class overloading demo";
        }

        
public string SayHelloOverLoading(string firstName, string lastName)

        {
            
//编写代码
            return "Hello:" + firstName + lastName + "This an C# class overloading demo";
        }

    }

   【2】操作重载:

   【2.1】操作重载:

    WCF服务支持核心的Web 服务协议,同样其元数据交换也是基于XML语言描述,客户端通过WSDL文件来了解服务方法相关的信息,包括参数的个数、类型、返回值、调用顺序等重要信息。由于WSDL不支持方法的重载,因此我们的WCF服务操作重载就无法通过WSDL暴露给客户端。如果我们在服务契约里定义了方法的重载,编译可以正常通过,但是启动服务宿主就会抛出System.InvalidOperationException异常,如下图:

    因此我们不能在WCF服务内定义和实现方法重载,否则无法暴露为服务操作。

   【2.2】解决办法:

   WCF给我们提供了一个解决办法,让我们可以在WCF服务类里使用服务操作的重载。WCF定义了一个机制OperationContract,使用OperationContract特性的Name属性,为操作指定别名:

[AttributeUsage(AttributeTargets.Method)]
public sealed class OperationContractAttribute : Attribute
{
   
public string Name
   {
get;set;}

   
//更多成员

}

    【3】代码实现分析:

    下面我们来给出一个具体的WCF服务实现操作重载,包括服务定义、宿主配置、客户端引用和测试的完整过程。

   【3.1】服务契约:

    定义了服务契约IWCFOverLoadingService,分别给出SayHelloOverLoading操作契约的3种不同定义和WCFService服务类里的实现。具体代码如下:

    //1.服务契约,操作契约重载
    [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
    
public interface IWCFOverLoadingService
    {
        
//操作契约
        [OperationContract(Name = "SayHelloOverLoading1")]
        
string SayHelloOverLoading();
        
//操作契约
        [OperationContract(Name = "SayHelloOverLoading2")]
        
string SayHelloOverLoading(string name);
        
//操作契约
        [OperationContract(Name = "SayHelloOverLoading3")]
        
string SayHelloOverLoading(string firstName, string lastName);

    }
    
//2.服务类,集成接口。实现契约
    public class WCFService : IWCFOverLoadingService
    {
        
//实现接口定义的方法
        public string SayHelloOverLoading()
        {
            Console.WriteLine(
"Hello! ,This an overloading demo for WCF Service ");
            
return "Hello! This an overloading demo for WCF Service  ";
        }
        
//实现接口定义的方法
        public string SayHelloOverLoading(string name)
        {
            Console.WriteLine(
"Hello! {0},This an overloading demo WCF Service ", name);
            
return "Hello! " + name + ", This an overloading demo for WCF Service ";
        }
        
//实现接口定义的方法
        public string SayHelloOverLoading(string firstName, string lastName)
        {
            Console.WriteLine(
"Hello! {0}    {1},This an overloading demo WCF Service", firstName, lastName);
            
return "Hello! " + firstName + " " + lastName + ", This an overloading demo for WCF Service "; ;
        }
    }

   【4】运行结果:

 

    这里分别调用三种服务操作,进行测试。运行的结果如图所示:

    【5】总结:

     以上就是本节对WCF服务操作重载的介绍,包括一般重载的基本定义和c#语言中简单的方法重载的实现。然后介绍了WCF操作重载的实现机制、局限性和解决办法,服务契约默认不支持操作方法重载,我们可以利用WCF已有的机制给出方法的别名来解决这个问题。然后给出了包括客户端等完整的测试解决方案,客户端反序列话生成服务类默认不支持服务操作方法重载的,生成的也是服务操作的别名方法。我们在客户端要想使服务代理类支持重载,以利用重载的优势,就需要重新修改客户端服务代理代码。 另外给出本节的实例代码供大家参考:

      继上一节WCF分布式开发步步为赢系列的(4):WCF服务可靠性传输配置与编程开发,本节我们继续学习WCF分布式开发步步为赢的第(5)节:服务契约与操作重载。这里我们首先讲解OOP面向对象的编程中方法重载,重载的意义,WCF服务编程开发如何实现操作重载,随后是代码分析部分,给出了服务端服务契约定义和实现操作重载的注意的问题和实现过程,然后详细介绍了客户端实现操作重载的方式。

NET技术WCF分布式开发步步为赢(5)服务契约与操作重载,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。