2008-08-09 81 views
7

我还是新来的ASP.NET世界,所以我可以离开这里基地,但到目前为止,这是我的(有限)知识!ASP.NET Web服务结果,代理类和类型转换

可以说我在业务名称空间中有一个标准业务对象“Contact”。我编写了一个Web服务来从数据库中检索联系人信息,并将其返回。然后,我写一个客户端应用程序来请求所述细节。

现在,我还创建了一个实用的方法,它需要一个“联系人”,并与它做一些魔术,如Utils.BuyContactNewHat()说。当然需要Business.Contact类型的联系人。

然后我回到我的客户端应用程序,并且想要使用BuyContactNewHat方法,因此我添加了对我的Utils命名空间的引用,它就在那里。然而,一个问题出现了:

Contact c = MyWebService.GetContact("Rob); 
Utils.BuyContactNewHat(c); // << Error Here 

由于GetContact返回类型是MyWebService.Contact而不是Business.Contact预期。我明白为什么会这样,因为在访问Web服务时,实际上是针对由WSDL生成的代理类进行编程。

那么,有没有一种“更容易”的方法来处理这种类型的不匹配?我正在考虑尝试创建一个通用转换器类,它使用反射来确保两个对象具有相同的结构,而不仅仅是将值从一个转移到另一个。

回答

4

您正处于正确的轨道上。要将来自代理对象的数据返回到您自己的对象之一中,您必须执行左侧 - 右侧代码。即复制属性值。我敢打赌,你已经有了一种使用反射的通用方法。

如果某些人只想通过网络获取业务对象,则会使用除Web服务(.net远程处理)之外的其他人。或者他们会使用二进制序列化。我猜你正在使用Web服务的原因,所以你必须做财产复制。

4

实际上您不必使用WSDL为您提供的生成类。如果你看看它生成的代码,它只是调用一些.NET框架类来提交SOAP请求。在过去,我已将该代码复制到一个普通的.cs文件并对其进行编辑。虽然我没有具体尝试过,但我没有看到没有理由不能删除代理类定义,并使用原始类来接收SOAP调用的结果。它必须已经在引擎盖下进行反思,它做两次似乎是一种耻辱。

1

我建议你看看写一个Schema Importer Extension,你可以用它来控制代理代码的生成。这种方法可以用于(平稳地)解决问题而不会发生任何问题(例如将对象从一个名称空间复制到另一个名称空间,或修改代理生成的reference.cs类,以便在下次更新Web引用时替换它)。

下面是关于这个问题的(很)好教程:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx