2009-01-27 68 views
0

我有一个连接到第三方Web服务的Web服务客户端应用程序。第三方已经更新了他们的Web服务,所以现在我的客户端应用程序因SOAP异常而失败。不幸的是,我不能简单地更新我的应用程序以使用新的Web服务,因为我的一些用户仍将使用旧的Web服务。所以基本上我希望能够使用我的客户端应用程序的单一版本来处理任一版本的Web服务。在运行时选择'using'命名空间

因为Visual Studio会生成一堆我添加Web引用时编译的代码,所以现在我有两个文件:一个为每个Web服务版本生成一个。这两个API实际上都是相同的,它只是看起来已经改变的底层SOAP消息。我已经将每个生成的文件放到它们自己的名称空间中以避免冲突。所以现在我想能够选择在运行时使用哪个命名空间(基于配置参数)。

例如:

if (useOldVersion) 
    using OldVersionNamespace; 
else 
    using NewVersionNamespace; 

显然,这永远不会成功,因为就没有办法编译引用的元素在这个命名空间中的代码。有没有简单的方法来处理这个问题?也许我可以使用反射来做我在运行时需要的东西?

我真正能想到的唯一事情就是将我当前的代码复制/粘贴到两个不同的文件中,唯一的区别是顶部使用哪个名称空间。这似乎是一个非常糟糕的主意,但。

+0

它是否必须是运行时?如果应用程序将始终为特定客户端使用相同版本(任意一个),则可以使用#if创建应用程序的两个版本。 – configurator 2009-01-27 17:37:55

+0

是的,它需要在运行时,因为一些用户最终会切换到新的Web服务,并且需要在不必更新客户端应用程序的情况下发生。 – Jason 2009-01-27 17:56:45

回答

4

使两组生成的类实现一个通用接口。这对于部分类型来说很简单 - 您不需要更改生成的类,只需创建一个合适的接口,然后使用与生成的类型相同的类型的文件,即可实现该接口。

然后,您编码到接口,并根据配置文件选择在一个位置选择哪个实现。

对此的额外好处是您可以针对您的代码编写单元测试,嘲笑Web服务。

+0

这可能是最正确的解决方案,但有一堆类(100+),每个类都有一堆属性/方法/等等。我想我希望能够更快修复... – Jason 2009-01-27 17:31:30