【问题标题】:VS2010 Advantages of Add Service Reference over direct ClientBase<>VS2010 添加服务引用优于直接 ClientBase<> 的优势
【发布时间】:2011-07-02 06:14:55
【问题描述】:

我注意到,当在 VS2010 中使用“添加服务引用”时,会创建大量文件。其中一个文件是 Reference.cs,它为服务合同创建了一个 ClientBase。

因此,我想知道 VS 创建的大量额外文件是否有任何优势,或者我可以自己使用 ClientBase 并跳过“添加服务引用”选项。

我应该注意,在我的情况下,双方都在我的控制之下。

【问题讨论】:

    标签: wcf visual-studio-2010


    【解决方案1】:

    以下是我认为不同方法的优缺点概述:

    使用 Visual Studio 生成的服务代理

    优点

    • 轻松上手
    • 能够在服务合同发生变化时快速更新代理
    • 无需维护自定义代码

    缺点

    • 由于通过 ClientBase<TChannel> 类与 WCF 基础架构的高度耦合,使消费者难以使用任何流行的 .NET 隔离框架(例如 Rhino MocksMoq)进行单元测试
    • 创建了不必要的额外文件

    使用 WCF 通道 API

    优点

    • 由于IChannelFactory<TChannel> 接口提供的解耦,在任何隔离框架中都具有高可测试性
    • 对服务调用方式的更多控制

    缺点

    • 需要一些初步的努力才能开始
    • 需要维护的一些自定义代码

    总而言之,使用代理可以减少使用 WCF 服务时的摩擦同时放弃一些控制和可测试性。使用 Channel API 需要更多代码以换取更高程度的灵活性,这非常方便,特别是如果您想将组件与它们通信的 WCF 服务分开进行单元测试.

    相关资源:

    【讨论】:

    • @Enrico:我对消费者进行单元测试没有问题。我只是注入了一个实现服务契约的模拟对象。你指的是什么?
    • @John 只要您不调用任何特定于 WCF 的基础结构方法来释放底层通道(如 ICommunicationObject.CloseICommunicationObject.Abort 方法),这将起作用,因为它们不是服务的一部分合同。
    • @Enrico:没错。但即便如此,我所需要的只是一个实现这两个接口的模拟类。单元测试没有难度。再次,您在测试中发现了哪些问题?
    • @John 我的目标是让消费者依赖于一个接口,该接口公开服务操作并提供来自ICommunicationObject 的基础设施方法。我发现实现这一目标的唯一方法是使用 IChannelFactory 接口。这样我就可以轻松地使用隔离框架生成假实现者,而无需手动创建测试替身。如果您有解决此问题的替代方法,我肯定会对它感兴趣。
    • @Enrico:我还没有尝试过使用隔离框架。也许他们无法创建实现多个接口的模拟类?如果是这样,也许创建自己的接口来继承两者,然后让框架使用该接口创建一个模拟?无论如何,单元测试肯定没有一般问题。仅使用您喜欢的方法进行单元测试。
    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2011-10-08
    • 2013-09-11
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多