在运行时选择“使用”命名空间

时间:2009-01-27 16:56:08

标签: c# web-services

我有一个连接到第三方Web服务的Web服务客户端应用程序。第三方已更新其Web服务,因此现在我的客户端应用程序因SOAP异常而失败。不幸的是,我不能简单地更新我的应用程序以使用新的Web服务,因为我的一些用户仍将使用旧的Web服务。所以基本上我希望能够使用单个版本的客户端应用程序使用任一版本的Web服务。

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

例如:

if (useOldVersion)
    using OldVersionNamespace;
else
    using NewVersionNamespace;

显然,这将无法工作,因为无法编译引用此命名空间中的元素的代码。有没有一种简单的方法来处理这个问题?也许我可以使用反射在运行时做我需要的东西?

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

2 个答案:

答案 0 :(得分:4)

使两组生成的类实现一个公共接口。使用部分类型非常简单 - 您根本不需要更改生成的类,只需创建一个适当的接口,然后创建一个与生成的类型相同的文件,并说它们实现了接口。

然后编写接口,然后根据配置文件选择要在一个位置选择的实现。

这样做的另一个好处是,您可以针对您的代码编写单元测试,模拟Web服务。

答案 1 :(得分:0)

你不能使用编译时间吗?

#If (BuildType)
using X;
#else
using Y;
#endif

http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx[link text] [1]

这很快又脏。希望有所帮助!