WCF技术剖析(卷1)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.1.1 抽象、接口与服务契约

完全从字面上理解,“契约”就是交互双方或多方就某个关注点达成的一种共识,是一方向另一方的一种承诺。签署了某个契约就意味着自己有义务履行契约中规定的各项规定,一旦违约势必影响契约双方的正常交互。“接口”是保证两个事物无缝结合的截面,只要保证双方接触的这个截面保持不变,无论其他地方如何变化,都不影响双方的正常接合。

从这个意义上讲,契约和接口几乎可以划上等号。它们都是双边的,都致力于解决两者之间的交互问题,它们针对交互的层面进行抽象,从而保证交互的稳定性。软件工程是一种不同于传统意义上的工程学,它的宗旨在于如何使我们的软件能够尽可能地应对各种变化,这种变化可能是可以预见的,但绝大部分都是不可预期的。“唯一不变的是变化”,这句话用在软件开发中恰如其分。那么如何提高软件适应变化的能力呢?一个永恒的宗旨就是:识别并分离“易变”与“不变”,依赖于“不变”。绝大部分的设计模式都是基于这样一个宗旨,在他们各自使用的场景中分离出“易变”和“不变”的,避免对“易变”因素的依赖。只有这样,才能以不变应万变。

从交互的角度来讲,什么是“可变的”,什么又是相对“不变的”呢?那就要看交互的本质了。交互的目的可以看成是一种 “服务的消费”,一方消费另一方提供的服务或功能。那么“不变”的就是服务或功能本身,“易变”的就是服务或功能的具体实现。对于服务消费者来说,它只希望对方能够提供自己所需的服务或功能就可以了,而不会关心对方是如何实现该服务或功能的。

按照面向服务的原理,服务的一个基本的特性是“自治”,服务单独提供某种功能。但是“自治”并不意味着“孤立”,面向服务反而注重服务之间的交互。如何使服务之间的交互显得稳定,使之不受对方服务变化的影响,面向服务崇尚基于“契约”的服务交互。

所以,服务契约在面向服务设置中显得尤为重要,服务契约的合理设计意味着整个设计成功了一半。将服务实现和服务契约分离,服务实现服务契约,服务契约被公布出来,服务的消费者通过服务契约消费服务。无论服务实现如何改变,只要服务契约保持不变,就不会影响服务的正常访问。

服务契约即接口,是对功能的抽象,而功能通过一个个的操作(Operation)承载,所以服务契约可以看成是一个相关操作的集合。