为什么WCF服务使用接口作为服务契约而不是抽象类?

时间:2011-12-19 16:58:12

标签: wcf web-services servicecontract

这是我在接受采访时提出的一个问题。

创建WCF服务时,会得到两个文件; “IService.cs”和“Service.cs”。为什么它是实现接口的类而不是继承抽象类的类。不回复说你不能在抽象类上放置[servicecontract]属性。我知道你只能将它应用于接口,但为什么呢?

3 个答案:

答案 0 :(得分:6)

可以实现多个接口。一个人只能继承一个抽象类。

答案 1 :(得分:6)

如果您将服务的实现指定为将客户端与服务紧密耦合的服务,则WCF会将客户端与服务完全分离。

答案 2 :(得分:1)

我能想到的几个原因:

  • 明确的意图陈述 - “这组API签名完全与任何可能的实现分离”。相比之下,抽象类(在我看来)更像是“这个基类被设计为使用这组派生类”的声明。
  • 更开放的修改 - 一旦你继承了一个基类,那就是它。由于[ServiceContract]没有实现,为什么要浪费你拥有的一个继承槽?例如,除了实现ServiceBase接口之外,我们所有的服务类都继承自提供公共上下文状态和方法的抽象[ServiceContract]类。但是,即使不是这种情况,我仍然可以将基类槽留空以备将来使用。
  • 如果合适,它允许一个服务类实现多个[ServiceContract]
  • 如果您使用的是严格的合约版本控制系统,它依赖于从另一个继承一个[ServiceContract],那么将服务类添加到同一个继承树将会毁掉它。