在WCF中使用接口作为服务合同的优点

时间:2014-04-10 07:52:12

标签: wcf interface servicecontract

我正在寻找正确的解释为什么我们需要在WCF中使用接口作为服务合同。我得到了这个URL Why does .net WCF Service require the Interface,从这里我开始知道我们可以在类而不是接口上编写服务契约属性。

[ServiceContract]
public class TheService
{
   // more stuff here
}

配置条目

<services>
    <service name="YourServiceName">
        <endpoint address="" behaviorConfiguration="httpBehavior" binding="webHttpBinding" contract="TheService"/>
    </service>
</services>

但非常失望的是,没有得到所有有效理由,例如为什么人们经常使用界面作为服务合同?

所以请告诉我使用interface作为服务合同时获得的所有优势。所以寻找使用接口作为服务合同的所有有效点。因此,为了更好地理解,请给出示例场景的要点。感谢

1 个答案:

答案 0 :(得分:2)

正如您所演示的那样 - 您不需要 来定义服务合同的接口以使其正常工作。但是,这样做可以说,你的班级违反了Single Responsibility的原则(授予这是正式的OO原则 - 但在我看来,这是普遍的原则之一,似乎在任何地方都是一个好主意)。 / p>

服务合同充当&#34;合同&#34; (duh!)服务的发布者和使用它的客户之间。因此,一旦您有客户使用它,您需要非常小心您所做的任何更改 - 特别是如果客户可能是您无法控制的第三方。根据&#34;单一责任原则&#34;,定义代表合同的接口允许您让此接口负责公共API,将其与实现分开。

[ServiceContract]
public interface ILoggingService
{
    [OperationContract]
    void LogMessage(string message);    
}

此实现依赖于所有客户端连接到同一实例的事实:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SingletonLoggingService : ILoggingService
{
    void LogMessage(string message)
    {

    }

}

此实现为每次调用提供了一个新的服务实例:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class SingletonLoggingService : ILoggingService
{
    void LogMessage(string message)
    {

    }

}

接口的优点是,我可以随意使用实现(包括它的实例化模式,并发性,它在客户端会话下的行为,命名空间,名称等等),而不必担心我可能会破坏任何客户。

同意 - 即使您将服务合同定义为类,也有一些方法可以保持向后兼容性 - 但它更容易出错并且您更容易忘记某些内容。分离公共API及其实现可以使代码更清晰,并且开发人员犯错的风险也会更小。