Wcf 服务合同(接口)是否应向客户公开?

Wcf 服务合同(接口)是否应向客户公开?,wcf,Wcf,在学习WCF的过程中 举例来说,假设我有3个程序集: 1.)Service.Contract:具有接口MyType IMyInterface()的定义 2.)服务:实现接口MyType MyService():IMyInterface 3.)客户机:它调用服务 我的基本问题是“Service.Contract”项目是否应该公开给“Client”项目,因为它需要知道接口的原型。如果是,这是否违反了SOA原则?如果没有,那么我们如何实现仅使用端点地址对服务的调用?一般方法是向项目添加服务引用,该引用

在学习WCF的过程中

举例来说,假设我有3个程序集:

1.)Service.Contract:具有接口MyType IMyInterface()的定义

2.)服务:实现接口MyType MyService():IMyInterface

3.)客户机:它调用服务


我的基本问题是“Service.Contract”项目是否应该公开给“Client”项目,因为它需要知道接口的原型。如果是,这是否违反了SOA原则?如果没有,那么我们如何实现仅使用端点地址对服务的调用?

一般方法是向项目添加服务引用,该引用创建基于客户端的类,这些类实现已发布的数据契约和服务的客户端调用功能。实际上,您没有使用定义服务的接口或定义数据契约的类。

是。该接口需要向客户端公开。否则,客户端不知道服务上有哪些可用方法

有一些可用的工具可用于从服务的元数据为您生成接口代码(假设您公开了服务数据),因此客户端不需要实际的接口文件。当您使用VisualStudio(或其他开发工具)并使用“添加服务引用”时,基本上就是这样

或者,还有一个与dotNet-svcuti.exe一起提供的命令行工具:


我不认为这会违反SOA原则。正如我先前的评论所说。如果客户不知道所执行的合同是什么,他怎么知道如何呼叫您的服务?

明白了。我缺少在客户机上生成接口代码的部分。添加服务引用成功了。谢谢!这个答案没有给出全部情况。向客户端添加服务引用只需重新创建Service.Contract程序集中定义的类型。SOA要求您使用契约而不是行为,通过在客户端中添加对Service.contract程序集的引用,您并没有违反这一原则。如果您同时构建服务器和客户机,那么在两者之间共享契约程序集是没有问题的。