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

Nel*_*mel 6 c# unit-testing web-services dependency-injection

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

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

Mar*_*ann 6

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

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

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