【问题标题】:Advantage of using interface as Service contract in WCFWCF中使用接口作为服务契约的优势
【发布时间】:2014-04-10 07:52:12
【问题描述】:

我正在寻找正确的写为什么我们需要在 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>

但非常失望的是没有得到所有正当理由,例如人们经常使用接口作为服务合同的原因?

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

【问题讨论】:

  • 是否有任何工具可以将 Web 服务转换为 wcf 而无需大量手动工作?
  • 一个原因可能是接口使代码更简洁,因为您不能错误地实例化它。从来没有考虑过说实话。对于服务合同,界面对我来说更合乎逻辑。不过,我通常在 SI/FL 层中实现它。
  • 接口可以在专用程序集中的各方之间共享。有了接口,你还可以使用依赖注入模式来注入服务的当前实现。
  • 您在问题中分享的链接是最佳答案。 “最佳实践”。
  • 从我分享的链接中,人们不太清楚为什么人们会选择服务合同的接口。

标签: wcf interface servicecontract


【解决方案1】:

正如您所展示的 - 您不需要为服务合同定义接口以使其正常工作。但是,这样做有争议的是,您的班级违反了Single Responsibility 的原则(当然这是正式的 OO 原则 - 但在我看来,它是普遍原则之一,似乎在任何地方都是一个好主意)。

服务合同充当服务发布者和使用它的客户之间的“合同”(呵呵!)。因此,一旦您有客户使用它,您需要非常小心您所做的任何更改 - 特别是如果客户可能是您无法控制的第三方。根据“单一职责原则”,定义一个代表合约的接口允许您让该接口负责公共 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 与其实现分开可以使代码更简洁,并降低开发人员犯错的风险。

【讨论】:

  • 无论出于何种原因,你强调这些都是有效的,但不是强制性的。很多人说如果我们让我们的服务成为服务契约而不是接口,那么我们的业务逻辑将暴露给客户端,但真的不明白它是如何实现的,因为当客户端创建代理时,代理将永远不会在客户端公开实现细节.所以告诉我关于服务实施肯定会出现什么样的问题。谢谢
  • 我搜索 goole lot 以了解服务安全点可能出现的实际问题?很多人说,如果我们让我们的服务成为服务契约而不是接口,那么我们的业务逻辑将暴露给客户端,但真的不明白这怎么可能。你有什么想法吗?
  • 正如我在第一句话中所说的 - 这当然不是所有工作都必须的。如果不使用界面导致一些安全漏洞,我会感到惊讶。他们可能得到的观点是,通过使用类作为契约,您可能会无意中暴露一些实现细节(如类的名称),这可能暗示您如何对服务发起攻击。例如,如果我的类名为“SqlLogger”,那么有人可能会尝试发起 SQL 注入攻击。我相信无论如何你都可以通过在 ServcieContract 属性上指定一个名称来解决这个问题。
  • 虽然从功能的角度来看不是强制性的,但我认为从可维护性和“风险”的角度来看,您应该使用接口。它使代码更简洁、更易于理解,从而降低了错误泄漏到实时环境中的风险。这只能是一件好事 - 在某些组织中,这足以确保它成为“强制性”政策......!
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多