【问题标题】:Alternative to service reference替代服务参考
【发布时间】:2011-08-12 20:43:36
【问题描述】:

我正试图通过解决一些痛点来帮助一个项目团队简化他们的工作。

他们在代码中的痛点之一是,他们通过服务引用(代理)使用 WCF 服务 [即Visua Studio 2008 中的“添加服务引用”。这会产生很多问题,包括部署开销、Souce Control 获取更新代理等最新相关问题。

为了处理这些和其他与服务引用相关的问题,我正在寻找一个很好的替代服务引用的方法。我已经看过ChannelFactory,我最倾向于那个。这似乎是一个很好的解决方案。

但问题是,有很多代码像这样使用这些服务

BatchClient client = new BatchClient(); //Batchclient is  a proxy
batchData = client.GetBatchData(batchNumber)

因此,如果我使用 ChannelFactory 路径,我将需要在整个项目中更新所有代码片段,如上述。由于更改量很大,团队对此选项不太满意。

我的问题是,除了“添加服务引用”之外,还有其他更好的替代方法吗?只需最少的代码更改即可使用?或者有什么方法可以在不影响现有代码的情况下使用 ChannelFactory?

【问题讨论】:

  • 这不会解决您的问题,但通常最好针对接口而不是实现类进行编码以避免此类情况。
  • 我发现一个接口是一个共享的dll往往不那么痛苦。

标签: .net wcf channelfactory service-reference


【解决方案1】:

首先,我相信您可以通过创建自己的代理BatchClient 来实例化通道,从而轻松解决“必须替换大量代码”问题。它的工作方式与当前使用的生成代码基本相同。

但是在迁移到无代理、合同共享模型之前,我真的会考虑您为什么要迁移。我不再使用生成的代码选项,主要是因为熟悉 WCF 并没有必要。不过,我相信“添加服务引用...”模式对于 WCF 初学者来说更容易,而且完全不会花费您。

问自己以下问题(或者更确切地说,向我解释):

  • 部署开销是多少?我没有看到。您生成的代理将在部署后工作。您可以在配置文件中更改服务地址和行为。
  • 源代码管理问题/获取最新版本?这也不应该是一个问题。只需获取最新的,并使用最新的。如果服务发生了变化 - 并且您想利用这些变化 - 如果您使用共享合同文件并实例化您自己的频道,则需要获取最新版本的服务合同。
  • 更新代理?不熟悉代理的工作原理,它是什么以及它做了什么可能会导致这种情况,但是没有代理也不会更容易。真的,您只需右键单击选择“更新服务参考”,对吗?

您正在考虑的模型是更干净,并且可能允许更大的灵活性,但它并不简单。如果您的团队在维护生成的服务代理时遇到问题,那么我会解决这些问题,而不是通过删除代理将它们扔到 WCF 的深处。

【讨论】:

  • 感谢您的指导。我做了完全相同的原因,我一直质疑直到我能理解我有解决方案而没有太多改变。最后我要走这条路。删除了现有的引用并清理了源代码控制。再次添加了干净的参考。编写了 MSBuild 脚本,该脚本将通过命令行自动更新服务引用并协助部署。
【解决方案2】:

有一些文章建议使用类 ClientBase 来达到同样的目的。

看 a)https://aturcarablog.wordpress.com/2016/08/07/alternative-way-to-consume-wcf-service/

b)http://www.codeproject.com/Articles/412363/How-to-Use-a-WCF-Service-without-Adding-a-Service

因此,您的代码可以重写为:

using (var batchClient = new ServiceWrapper<IYourWcfService>("YourEndpointConfigurationName"))
{
    batchData = batchClient.Proxy.GetBatchData(batchNumber);
}

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 2014-07-19
    • 2015-01-29
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多