我正在寻找正确的解释为什么我们需要在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作为服务合同时获得的所有优势。所以寻找使用接口作为服务合同的所有有效点。因此,为了更好地理解,请给出示例场景的要点。感谢
答案 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及其实现可以使代码更清晰,并且开发人员犯错的风险也会更小。