【问题标题】:WCF Exposing Metadata or having the client implement the interface?WCF 公开元数据还是让客户端实现接口?
【发布时间】:2010-12-01 23:56:11
【问题描述】:

让客户端通过添加对服务的引用(基本上所有内容都是为您生成)或让客户端实现共享接口并且他们必须手动编写类来使用 WCF 服务的优点/缺点是什么?

谢谢!

【问题讨论】:

  • 查看这个类似的问题。有趣的是,回答的是同一个人。 stackoverflow.com/questions/3697181/help-debugging-wcf
  • 我认为这两个答案在不同的情况下都是正确的。对于我的特定场景,因为我必须选择一个正确的答案,所以我将使用 WSDL

标签: wcf


【解决方案1】:

一般来说,如果您不使用代码生成,那么您将不得不手动编写原本会为您生成的内容。

Andrew 提到的“维护问题”通过在服务合同发生变化时简单地使用“更新服务参考”来解决。如果这变得很麻烦,那么创建一个单独的项目来包含所有代理类。然后,您只需在一处使用“更新服务参考”。

当然,如果服务合同或相关合同以不兼容的方式更改,那么您的客户端代码将不得不更改。无论您使用哪种技术都是如此。

【讨论】:

  • 我在单独的库中自动生成代理类可行吗?当您生成服务引用时,它会在您的 app.config 文件中生成代理类和条目。如果您在没有 app.config 文件条目的情况下获得代理类,您不是只获得一半的好处吗? (请注意,我提倡您手动完成所有操作)。
  • @Andrew:对于将内容放入 app.config 的每个组件,app.config 问题都是相同的:您始终必须将库的 app.config 中的配置条目复制到应用程序中(或web).config 应用程序。总是。
【解决方案2】:

如果您自动生成代码,则存在维护问题。 每当您更改接口或任何服务器配置时,您都必须重新生成它。

因此,我从不从公开的元数据生成客户端。

接口应该在一个库中定义。我们称这个库为 MyContractsLib。服务实现应该在一个单独的程序集中(我称之为MyContractsImplementation)。客户端应该进入另一个程序集。

然后客户端应该使用 ChannelFactory 来创建服务。

        var cf = new ChannelFactory<MyContractsLib.MyContract>(this.EndpointName);
        MyContractsLib.MyContract serviceProxy = cf.CreateChannel();

唯一需要保证的情况是服务由第三方开发,并且您独立编写客户端应用程序。

如果您有时间和兴趣,请参阅this presentation 深入了解。

【讨论】:

  • 那么,当界面发生变化而你没有使用“添加服务引用”时,你会怎么做?
  • @John:客户端和服务实现应该从同一个文件中读取接口。我会将其添加到我的答案中。
  • 因此,当更改不兼容时,您仍然会遇到同样的问题,并且您必须确保您的构建系统正在引用包含合同的程序集的正确更新版本,并且它并没有那么不同从维护服务的“当前”实例和使用“更新服务参考”。在任何情况下,您都需要为非 .NET 客户端部署服务实例。
  • @John:我特别想到的场景是合同定义、服务定义和客户端都在同一个解决方案中。如果您要链接到在不同解决方案中更新的库,那么我会说这相当于第三方生成的服务。
  • 明确一点:这不是很 SOA。在这种情况下,客户端和服务非常紧密地耦合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多