WCF分布式开发步步为赢系列的(6):WCF服务契约继承与分解设计

  上一节我们学习了WCF分布式开发步步为赢(5)服务契约与操作重载部分。今天我们来继续学习WCF服务契约继承和服务分解设计相关的知识点。WCF服务契约继承有何优势和缺点?实际项目里契约设计有什么原则和依据?面向对象的设计经验有何值得借鉴的地方?这里我们会一一给出详细的介绍。本文首先介绍的是WCF服务中契约继承的一些概念、例子代码分析,其次来讲解服务契约的设计问题。首先介绍的也是进行服务设计的必要性,服务设计的原则,示例代码分析。最后是全文的总结部分。结构如下:【1】OO面向对象设计原则,【2】服务契约继承,【3】服务契约分解概念,【4】服务契约分解原则,【5】服务契约分解代码分析,【6】总结。

  【1】面向对象设计原则OO:

   这里我们有必要先回顾一下面向对象的经典的设计原则。这些设计原则对我们WCF服务契约的设计来说有重要的参考价值。服务契约实际利用了接口来定义实现,语法类似,WCF框架也是基于现有的语言体系,对此扩展了编程模型,比如增加了属性设置机制等。如果你曾经接触过OO面向对象的这些概念,那么这些设计原则理解起来不会困难。很多编程书籍里都会有介绍,设计模式相关书籍里会有比较详细的介绍。这里介绍几个主要的概念,为下文的继承和设计WCF服务契约部分作铺垫:

  <1>单一职责原则(SRP): 一个类应该仅有一个引起它变化的原因。

  <2>开放封闭原则(OCP): 类模块应该是可扩展的,但是不可修改(对扩展开放,对更改封闭)。

  <3>Liskov 替换原则(LSP): 子类必须能够替换它们的基类。

  <4> 依赖倒置原则(DIP): 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。 抽象不应该依赖于实现细节,实现细节应该依赖于抽象。

  <5>接口隔离原则(ISP): 不应该强迫客户程序依赖于它们不用的方法。

  【2】服务契约继承:

  服务契约的定义和接口定义类似,接口可以继承与多个接口。但是WCF契约属性是不支持继承的。由于WCF框架自身的问题,不支持契约属性的继承,因此这给我们服务契约属性的声明和使用却有不少限制。在使用契约继承属性的过程中腰注意服务端契约的属性继承问题,此外就是客户端添加服务引用后,无法还原服务端契约层级的关系,所有的操作契约由一个契约类封装。因此实际编程我们要兼顾到两个方面的情况。

  【2.1】服务端契约层级:

接口支持继承。但ServiceContract特性不支持继承的,我们查看其实现代码可以知道Inherited = false,即不支持继承,部分代码如下:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, Inherited =
false, AllowMultiple = false)]
    
public sealed class ServiceContractAttribute : Attribute
    {
        
    }

  【3】服务契约分解概念:

     下面我们继续讲解服务契约设计的一些概念知识。其实服务契约的设计在WCF分布式应用项目中属于比较重要的部分。服务契约的设计和实现相对来多比较复杂,除了注意已有的设计原则之外还要注意WCF契约相关的特性。面向服务分析与设计的属于一个较新的领域。实际的服务分析和设计我们还是借助于已有的经验和原则,来指我们更好地设计服务契约。这也是本节给出一个面向对象重要设计原则的原因。

因为WCF服务契约的定义借助现有的编程语言如C#,契约设计实际首先就是对服务接口的设计。我们应该如何设计服务接口?如何知道服务接口中应该定义哪些操作?每个接口又应该包含多少操作?等等都是我们必须考虑的问题。Service Contract Factoring就是要考虑服务接口的分解问题。在面向服务的应用程序中,可重用的基本单元就是服务接口。因此如何设计服务接口就是重中之重。

  【4】服务契约分解原则:

这里我们设计服务接口时候即遵循单一职责和接口隔离等原则,又要考虑系统的开发成本。合理的接口是专业的、松耦合的、规则化和可重用的接口。这些优势同样有利于整个系统的松耦合和可重用等特性。总的来说,契约分解的目的就是使接口包含的更少操作。

如果我们定义了太多的细粒度服务接口,虽然它们易于实现,但集成它们的代价太高。如果我们仅定义了一个复杂的服务接口,虽然集成的成本会降低,但却接口的实现和可维护性较差。我们设计面向服务的系统时,需要平衡两个影响系统的因素,接口成本和集成成本。参见下图。

  【5】服务契约分解代码分析:

这里我们来讲解一个简单的服务契约设计的例子。这里我们还继续使用交通车为例子进行讲解。

我们首先定义一个接口交通工具IVehicle,定义了如下:

    [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
    
interface IVehicle
    {
        
//操作契约,跑,开的契约
        [OperationContract]
        
string Run();
        
//操作契约,拉人、载人的契约
        [OperationContract]
        
string Take();
        
//操作契约,运输货物的契约
        [OperationContract]
        
string Carry();
    }

NET技术WCF分布式开发步步为赢系列的(6):WCF服务契约继承与分解设计,转载需保留来源!

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