WCF从理论到实践(17):OO大背离2010-08-24 cnblogs jillzhang概述上文说到了WCF和传统面向对象编程中不太一致的地方之一:操作重载(Operation Overload),本文讲述WCF 另外一个不太符合OO之处:服务契约和数据契约的继承关系。在面向对象的大原则中有下面两个原则1) 依赖倒置原则2) Liskov替换原则依赖倒置原则强调的是实现依赖于抽象,抽象不依赖于实现 ,而Liskov原则强调的是子类必须可以替换其基类,这在anytao大作<<你必须知道的.Net>>中都有详细的阐述。本文无意阐述这两个原则的细节,想了解OO原则的知识,可以阅读王兄的大作。本文只探讨WCF架构下对这两个原则的辩证统一关系。WCF架构的特征在弄清楚WCF在上两个OO原则矛盾统一的关系之前,我想有必要先了解WCF的架构,清楚了WCF架构之后,才能更清楚地明白为何WCF中对上述原则的辩证关系!我们先来看下WCF 通讯的工作原理

请看上面的WCF体系结构图(该图原出处<<WCF服务编程>>一书),从图中我们看出WCF通讯双方是存在明显的分界的,尽管WCF也支持in-proc,但这种分界依然存在。我们知道接口和抽象类都是对现实世界的一种抽象描述,它们基于的是现实中的真实场景。比如公鸡能报晓,猴子能上树,老鼠能盗洞,公鸡母鸡都是鸡,鸡鸭鹅全是家禽等等。这些都是人类在长期社会生活中,对现实世界的一种认识!这种认识是存在地域特性的,比如有些地区视蛇为毒虫猛兽,如果给蛇作个接口的话,会包含如下云云:void EatPeople();它会吃人,这种印象很不好,但是另外一些地区可能就将蛇作为图腾,他们眼中蛇是神圣的,如果让他们描述蛇,他们会说: void ProtectPeople();蛇能庇佑人类!同样对事物的分类也是如此。隐喻到软件开发中,我们在一个边界下定义的接口规范和类的层次对于其他边界下的系统是否一定通用呢?答案是否定的。在WCF中,服务与客户是完全松散的耦合,他们之间完全没有必要了解对方的具体实现,如果不是用到WCF,二者老死都可以不相往来。但二者之间加入WCF之后便有了联系,我的理解是代理(Proxy)便是二者之间的红娘,它起到了桥梁,纽带,中介的作用。既然是中介,那么他就应该一碗水端平,不能因为服务端的自身问题给客户端带来不必要的负担,反之亦然!也就是说WCF服务端定义的一些层级概念是服务端的规范,这些规范针对客户端来说,是否适用,那要看客户端的具体业务逻辑,所以代理这个红娘就不能将服务端的逻辑强加给客户端。下面我们就从服务契约(ServiceContract)的层级关系和数据协定(DataContract)的层级关系两个方面看看WCF框架是如何体现上述的特征的。