Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WCF中使用接口作为服务契约的优势_Wcf_Interface_Servicecontract - Fatal编程技术网

在WCF中使用接口作为服务契约的优势

在WCF中使用接口作为服务契约的优势,wcf,interface,servicecontract,Wcf,Interface,Servicecontract,我正在寻找正确的答案,写下为什么我们需要在WCF中使用接口作为服务契约。我得到了这个url,从这里我知道我们可以在类而不是接口上编写服务契约属性 [ServiceContract] public class TheService { // more stuff here } 配置条目 但是非常失望的是,没有得到所有有效的理由,比如为什么人们经常使用接口作为服务契约 所以,只要告诉我当我们使用接口作为服务契约时所获得的所有优势。因此,寻找将接口用作服务契约的所有有效点。所以,也用示例场

我正在寻找正确的答案,写下为什么我们需要在WCF中使用接口作为服务契约。我得到了这个url,从这里我知道我们可以在类而不是接口上编写服务契约属性

[ServiceContract]
public class TheService
{
   // more stuff here
}
配置条目

但是非常失望的是,没有得到所有有效的理由,比如为什么人们经常使用接口作为服务契约


所以,只要告诉我当我们使用接口作为服务契约时所获得的所有优势。因此,寻找将接口用作服务契约的所有有效点。所以,也用示例场景给出要点,以便更好地理解。正如您所演示的那样,谢谢您-您不需要为服务合同定义接口就可以使其正常工作。然而,这样做是有争议的,您的类违反了的原则(当然这是一个正式的OO原则-但在我看来,这是一个普遍的原则,似乎是一个好主意无处不在)

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

是否有任何工具可以将web服务转换为wcf而无需大量手动工作?一个原因可能是该接口使代码更干净,因为您不能错误地实例化它。从来没有考虑过诚实。对于服务合同,我觉得接口更符合逻辑。不过,我通常在SI/FL层实现它。接口可以在专用程序集中的各方之间共享。有了接口,您还可以使用依赖注入模式来注入服务的当前实现。您在问题中共享的链接是最佳答案。“最佳实践”。从我分享的链接来看,不太清楚人们为什么会选择服务合同接口。不管你在这里强调的是什么原因,这些都是有效的,但不是强制性的。许多人说,如果我们将服务作为服务契约而不是接口,那么我们的业务逻辑将向客户机公开,但实际上并不理解这是如何实现的,因为当客户机创建代理时,代理永远不会在客户机端公开实现细节。因此,请告诉我,在服务实现方面肯定会出现什么样的问题。thanksi search goole lot了解在服务安全方面可能出现的实际问题?许多人说,如果我们将服务作为服务契约而不是接口,那么我们的业务逻辑将向客户机公开,但实际上并不理解这是如何可能的。你对此有什么想法吗?正如我在第一句话中所说的——这当然不是所有事情都必须做到的。如果不使用接口导致安全漏洞,我会感到惊讶。他们可能得到的要点是,通过使用类作为契约,您可能会无意中暴露一些实现细节(如类的名称),这可能暗示您如何对服务发起攻击。例如,如果我的类名为“SqlLogger”,则可能有人试图发起SQL注入攻击。我相信你可以通过在ServcieContract属性上指定一个名称来解决这个问题。虽然从功能的角度来看不是强制性的,但我认为从可维护性和“风险”的角度来看,你应该使用一个接口。它使代码更加简洁易懂,从而降低了错误泄漏到实时环境中的风险。这只能是一件好事——在一些组织中,这足以确保它成为一项“强制性”政策。。。!
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class SingletonLoggingService : ILoggingService
{
    void LogMessage(string message)
    {

    }

}