DI与自动生成的Web服务客户端

时间:2014-03-04 02:02:46

标签: c# web-services unit-testing dependency-injection

我正在尝试在整个应用层中进行依赖注入,并且遇到了我确信其他人已经看到的场景。我们使用了一些第三方Web服务,并且使用基类自动生成客户端。客户端没有接口,数据类型位于同一文件/项目中。

显而易见的问题是,如果我想进行单元测试,我需要模拟服务。我需要提取一个接口并将数据类型移动到真实/模拟客户端可用的“合同”项目中。但是,下次自动生成客户端时,需要重做工作。在运行时创建代理没有多大帮助,因为我们必须从WSDL手动创建接口和数据类型。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:5)

从实现中提取接口无论如何都不会对你有所帮助,因为它将是一个糟糕的抽象。

接口应该由使用接口的客户端定义和拥有。正如Agile Principles, Patterns, and Practices解释的那样,“clients [...]拥有抽象接口”(第11章)。因此,任何定义以数据为中心的接口的尝试,例如从自动生成的Web服务客户端提取接口,都必然会迟早引起问题,因为它违反了各种SOLID原则,如依赖性倒置原则或接口隔离原则。

相反,您的客户端代码应该定义他们需要的接口。然后,您始终可以使用自动生成的Web服务客户端实现这些接口。如果您使用过Microsoft的工具(Visual Studio,wsdl.exe等),则相关的自动生成的类应该已经是部分类,这意味着您应该可以向其添加行为触摸自动生成的部分。