【问题标题】:Web Service wrapperWeb 服务包装器
【发布时间】:2012-04-30 11:43:24
【问题描述】:

我正在编写一个引用某些 WCF 服务的 dll。 该 dll 充当服务的网关,所有调用都通过它。 可能会有并发调用。

我已经引用了该服务,但现在我无法决定如何正确编写包装函数。

此功能是否有一些示例或最佳实践。

【问题讨论】:

标签: c# .net wcf web-services


【解决方案1】:

我会制作与 Web 服务接口匹配的包装器。包裹所有暴露的对象也是一个好主意。基本上创建一个代理。我发现对这类事情真正有用的是创建一个与 API 匹配的接口并实现它。这样,您可以创建 DLL 的虚拟版本进行测试,而无需与 WCF 调用相关的开销(或潜在成本)。如果您将来需要将 WCF 调用替换为备用提供程序,它也会变得更加简单。

例如,假设我们有一个用于处理付款的外部提供商的 WCF 服务。像这样的:

void ProcessPayment(float amount);

我们可以轻松地将其挂接到我们的代码中。问题是对接口的简单更改将导致我们不得不在引用代码的任何地方进行更改。如果我们将提供者更改为其他人,即使界面几乎相同,也需要这样做。添加类似简单界面的东西:

interface IPaymentProvider
{
    void ProcessPayment(float amount);
}

将我们的代码与 WCF 服务完全分离。我们可以像这样轻松地构建一个类:

class PaymentProviderAWrapper : IPaymentProvider
{
    void ProcessPayment()
    {
        // Call the WCF service
    }
}

我们可以使用像 Spring.NET 这样的工厂或依赖注入框架动态加载。更改为提供者 B 就像创建新包装器一样简单:

class PaymentProviderBWrapper : IPaymentProvider
{
    void ProcessPayment()
    {
        // Call provider B's Native DLL
    }
}

将您的代码从提供者 A 切换到 B 就像更改配置设置一样简单。

即使我们将库直接编译到我们的代码中,我们需要做的只是更改构造逻辑以使用新库。我们的应用程序的其余部分根本不会改变。只需简单的重新编译。

【讨论】:

  • 例子太简单了。包装事件处理程序(使用特定的 EventArgs)或异步方法怎么样?似乎有太多的维护开销。
【解决方案2】:

响应 Graymatter 的回答,我看不出调用服务包装器之间的区别是什么映射单个调用,传输绑定没有变化。

您首先要创建包装器的唯一原因是,以某种方式公开的接口本身不能满足您的要求。您可能想要这样做的原因有多种,但有一些常见的原因:

  1. 协议转换 - 服务未根据您的需要通过正确的传输绑定公开
  2. 服务组合 - 接口操作过于精细,不代表业务级操作。
  3. 身份验证 - 也许您需要在您正在使用的端点之上的身份验证层。

所以如何包装服务端点取决于你为什么要包装服务......

【讨论】:

  • 我阅读问题的方式是它是一个外部 WCF 服务。将这样的服务直接挂钩到您的代码中是鲁莽和冒险的。如果外部提供商定期更改其界面或关闭怎么办?然后,您需要使用更新的界面或新的提供程序来更新与外部系统交互的所有区域。在这方面,将所有包装逻辑包含在一个地方是有意义的。不过,我可能完全误解了最初的问题。
  • @Graymatter ,您理解正确。而你提到的原因就是我想要这个dll的原因
  • 感谢您的回复。我承认这可能是将您的服务包装在类似代理中的一个原因,但实际上公共端点多久会更改其合同?如果是这样,您不想更新所有消费者以使用最新的吗?我认为仅仅为了这个目的而在您的解决方案中添加一个额外的移动部分是矫枉过正的。
  • 这有点奇怪,但我更高兴有更多的活动部件。我更喜欢尽可能地解耦解决方案。根据我的经验,界面,甚至公共界面都有改变的习惯。很多时候,做出改变甚至不是技术原因。通常,诸如许可和成本之类的事情会生效。你想要的最后一件事是让你拥有短而卷曲的供应商。这就是我提出接口方法的原因,在混合中添加接口甚至可以进一步解耦解决方案。稍后我会用一个例子更新我的答案。
  • 有效积分。封装重复的 Web 服务设置并简化 Web 服务调用是有意义的。
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多