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

4

这是我在面试中被问到的一个问题。

当您创建一个WCF服务时,您会得到两个文件:"IService.cs"和"Service.cs"。为什么是实现接口的类而不是继承抽象类的类。不要回答说您不能在抽象类上放置[servicecontract]属性。我知道您只能将其应用于接口,但为什么?

3个回答

6

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


我并没有说多个服务合同(尽管我见过这样做的情况,其中两个合同具有不同的安全要求);我指的是任何类型的接口。 - John Saunders
@ Fahed。我们有多个服务实现了多个接口,所以这并不罕见! - ChrisBint
你可以实现多个接口,但我也可以继承一个抽象类并实现多个接口(假设该抽象类被装饰了 [servicecontract] 属性)。 - fbhdev
可以,但您只能继承一个抽象类。 - John Saunders
我完全同意,并且已经告诉他们了,我只是认为他们在寻找不同的答案。 - fbhdev
显示剩余3条评论

6

WCF完全将客户端与服务解耦,如果您指定服务的实现作为服务,那么您已经将客户端紧密地耦合到了服务。


1

我能想到几个原因:

  • 明确的意图陈述 - “这组API签名与任何可能的实现完全解耦”。相比之下,抽象类(在我看来)更多地是“这个基类被设计为与这组派生类一起工作”的陈述。
  • 更容易修改 - 一旦你继承了一个基类,就只有这一个了。由于[ServiceContract]没有实现,为什么要浪费你唯一的继承位置呢?例如,我们所有的服务类都继承自一个抽象的ServiceBase类,它提供了公共上下文状态和方法,此外还实现了[ServiceContract]接口。然而,即使不是这种情况,我也会保留基类位置以备将来使用。
  • 如果适当的话,它允许一个服务类实现多个[ServiceContract]
  • 如果您正在使用依赖于从另一个[ServiceContract]继承的严格合同版本控制系统,则将服务类添加到同一继承树中将破坏它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接