情况:
我们有一个库项目,其中包含我们处理的各种集成的大部分代码。许多集成都使用Web服务apis,我的主管不希望在项目中添加5亿个Web服务引用。
然后,我们通常会添加对新项目的引用,并将References.vb复制到解决方案中,只需调用生成的代码即可。如果对服务进行了更改,那会非常方便,但它可以正常工作。
最近,我遇到了一个问题,我们必须使用3个Web服务进行相同的集成。其中2个包含相同的类定义,但是,它们位于不同的名称空间中,因为它们属于不同的服务。这对我来说成了一个问题,因为其中一个服务根据用户ID搜索用户,另一个服务撤回用户块。两者都返回一个在语义上完全相同的对象或列表。我需要处理相同的数据,无论是来自一个服务还是另一个服务。
我的解决方案是删除服务中的重复类,并将其替换为从公共基类继承的类。这允许我使用两个对象,就好像它们是相同的一样,但是,它需要修改生成的Web服务代理。因此,每次需要重新生成代理时都需要进行此更改。
我很好奇你们所能想到的更好的解决方案是什么。
答案 0 :(得分:1)
你会后悔通过复制Reference.vb和编辑生成的文件来玩游戏。
切换到WCF,您将能够告诉它您要重用这些类型,而不是多个类型或多或少相同。
顺便说一句,如果在服务器更改后同时更新所有Web引用,它们将“相差不大”。答案 1 :(得分:0)
另一种选择是在Web服务预生成代理之上构建一个抽象层,这样当你对抽象层进行调用时,你总是可以使用相同的对象,因为它们被挤入(和抽象层中的Web服务代理。这也可以进行单元测试:)
答案 2 :(得分:0)
我认为你真的应该看看WCF for 3.5+,但是对于.NET 2.0,请看WSCF(Web Services Contract First)之类的东西,它定义XML中的契约并生成一组可跨服务重用的库。例如,您定义MyComany.WS.Common命名空间并在多个项目中使用该命名空间。然后,代码生成构建一个在所有Web服务中使用的共享类型库。我们在.NET 2解决方案中广泛使用它,它非常棒。我们不得不围绕代码生成做一些额外的工作,以使其适合我们的构建过程,但一旦完成,我们就再也没有回头了。
随着时间的推移,我们正在迁移到.NET 3.5,因此WSCF将变得过时
继承了WSCF thinktecture站点的链接。
答案 3 :(得分:0)
wsdl.exe
开关的 /sharetypes
允许在多个服务定义中使用相同的类型,前提是线路签名不正确。但是,我无法在我的情况下使用它,因为各种wsdl合同都是不小心命名的。