c# - 带有自动生成的 Web 服务客户端的 DI

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

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

明显的问题是,如果我想进行单元测试,我需要模拟该服务。我需要提取一个接口(interface)并将数据类型移动到一个“契约(Contract)”项目中,该项目可供真实/模拟客户使用。但是,下次自动生成客户端时,需要重做该工作。在运行时创建代理不会有太大帮助,因为那样我们将不得不从 WSDL 手动创建接口(interface)和数据类型。有更好的方法来处理这个问题吗?

最佳答案

从实现中提取接口(interface)无论如何都不会帮到你太多,因为这将是一个糟糕的抽象。

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

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

关于c# - 带有自动生成的 Web 服务客户端的 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22161444/

相关文章:

Java STS机制异常

ios - 如何测试依赖于 UIUserInterfaceIdiom (ios) 的代码

c# - 如何在 Visual Studio 2017 15.6.0 中调试单元测试

c# - 如何将字符串的值设置为空

c# - ThreadStatic 属性如何工作?

javascript - 将模型发布回包含复杂集合的 Controller

c# - gridview数据导出到asp.net中的excel

web-services - Web 应用程序可以检测本地打印机吗?

c# - 验证方法访问权限的最优雅方法是什么 (C#.Net)

javascript - 如何在 AngularJS 单元测试中触发 ui-sref?