我对 ASP.NET 世界还是个新手,所以我可能离题很远,但到目前为止,这是我(有限)所知的最好的!

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

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

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

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

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

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

有帮助吗?

解决方案

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

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

其他提示

您实际上不必使用 WSDL 为您提供的生成的类。如果您查看它生成的代码,您会发现它只是调用一些 .NET 框架类来提交 SOAP 请求。过去,我将该代码复制到普通的 .cs 文件中并进行编辑。尽管我没有具体尝试过这一点,但我认为没有理由不能删除代理类定义并使用原始类来接收 SOAP 调用的结果。它一定已经在幕后进行反射了,做两次似乎很遗憾。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top