11

我对 ASP.NET 世界还很陌生,所以我可能会离这里很远,但到目前为止,这是我(有限的)知识中最好的!

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

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

然后我回到我的客户端应用程序并想要使用该BuyContactNewHat方法,所以我添加了对我的Utils命名空间的引用,它就在那里。但是,问题出现在:

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

由于返回类型GetContact是 ofMyWebService.Contact并且不像Business.Contact预期的那样。我理解这是为什么,因为在访问 Web 服务时,您实际上是在针对 WSDL 生成的代理类进行编程。

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

4

3 回答 3

5

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

有些人如果只想通过网络获取业务对象,他们会使用 Web 服务(.net 远程处理)以外的东西。或者他们将使用二进制序列化。我猜您使用 Web 服务是有原因的,因此您必须进行属性复制。

于 2008-08-09T08:58:24.707 回答
3

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

于 2008-08-11T18:07:11.820 回答
1

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

这是关于该主题的(非常)好的教程:

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

于 2008-12-27T18:35:48.427 回答