我应该直接绑定到从Web服务返回的对象吗?

时间:2008-09-20 23:58:03

标签: c# web-services data-binding serialization

我应该直接绑定到从webservice返回的对象,还是应该有我绑定到gridcontrols的客户端对象?例如,如果我有一个返回对象的服务Car应该有一个客户端Car对象,我使用webservice Car对象的值填充? 什么是最佳实践? 在C#中,我是否需要将我的类标记为可序列化或对它们执行一些特殊操作?

5 个答案:

答案 0 :(得分:2)

这是一个很好的问题,它跟我自己提出的两个问题一样:

  1. Large, Complex Objects as a Web Service Result
  2. ASP.NET Web Service Results, Proxy Classes and Type Conversion
  3. 这些都值得为您阅读。

    继承我的两位:

    • 尽可能将Web服务的返回类型保留为原语。这不仅有助于减少消息的大小,还可以降低接收端的复杂性。
    • 如果确实需要返回复杂对象,请将它们作为原始xml字符串返回(我将在下面解释)。

    然后我做的是创建一个单独的类来表示对象并处理它的xml。我确保可以轻松地将类实例化并序列化为xml。然后,两个项目(Web服务和客户端)都可以使用具体对象引用DLL,但是没有与代理类的恼人耦合。如果您有共享代码,这种耦合会导致问题。

    例如(使用Car类):

    • Web服务(CarFactory)方法BuyCar(string make, string model)是一种返回汽车的工厂方法。
    • 您还可以编写一个Mechanic类,用于修复Car个对象,这是在不了解Web服务的情况下开发的。
    • 然后,为您的应用程序找到Garage课程。您为CarFactory服务添加了一个Web引用以获取您的汽车,然后将一些Mechanic添加到您的车库,然后破解您的指关节并准备从工厂获得一些汽车来获取它们工作。
    • 然后全部失败,当你得到CarFactory.BuyCar("Audi", "R8")的结果,然后告诉你的Mechanic.Inspect(myAudi)编译器呻吟,因为Car实际上是CarFactory.Car类型而不是原始Car类型,是吗?

    所以,使用我建议的方法:

    • 在自己的DLL中创建Car类。添加实例化方法并分别从/将其序列化为XML。
    • 创建您的CarFactory网络服务,添加对DLL的引用,像以前一样构建您的汽车,但不是返回对象,返回XML
    • 创建Garage添加对MechanicCar DLL和CarFactory网络服务的引用。调用您的BuyCar方法,现在它返回一个字符串,然后将此字符串传递给Car类,该类重新构建其对象模型。 Mechanic也可以愉快地处理这些Car's,因为所有内容都是用同一个赞美诗(或DLL)演唱的。)
    • 一个主要好处是,如果对象在其设计中发生变化,您需要做的就是更新DLL,并且Web服务和客户端应用程序与流程完全分离。

    注意:通常,创建一个Facade图层可以使用Web服务并从XML结果中自动生成对象。

    我希望这是有道理的,如果没有,那么请大声喊叫,我会澄清。

答案 1 :(得分:0)

这实际上取决于您从Web服务获得的内容。如果它们是简单的数据传输对象而您只显示数据,那么是的,您可以绑定。如果您打算编辑对象,则可能没有用,因为您需要跟踪更改。

客户跟踪上的对象和/或集合是否发生了变化?如果是这样,你可以使用它们。

如果您没有更改跟踪,那么您需要自己跟踪更改,因此您可能需要翻译对象或将其包装在某些内容中以跟踪更改。

同样,这实际上取决于你得到了什么,他们支持什么,你正在做什么,以及服务器想要改变的响应。

答案 2 :(得分:0)

您可以做的一件事是使用您想要的任何其他功能创建与Web服务数据协定相对应的客户端类,并将Web服务引用设置为重用现有类型。然后没有理由创建一个额外的包装类来绑定。

答案 3 :(得分:0)

如果直接绑定到Web服务类型,则会引入耦合。如果Web服务将来发生变化,这可能会产生不希望的副作用,这意味着代码会发生很多变化。

例如,如果您今天使用.asmx Web服务,然后明天转移到WCF怎么办?如果你使用了WCF不会序列化的类型,这可能意味着你的代码会发生很多变化。

从长远来看,创建特定的客户端对象然后在Web服务数据协定类型之间进行转换通常会更好。这可能看起来很多工作,但是当重构时间时,这通常会得到很大的回报,因为您的更改已在一个地方进行了本地化。

答案 4 :(得分:0)

如果您是网络服务和客户的所有者 并且您需要Web服务调用的参数是复杂的类,其中不仅包含数据,还包含行为(实际编码逻辑),那么在使用Web服务框架工作开发这些Web服务时,您会有点蠢蠢欲动。
正如answer by Rob Cooper中建议的那样,您可以使用纯xml作为Web服务参数和xml序列化,但有一个更清晰的解决方案。
如果您使用的是Visual Studio 2005(可能适用于2008年),您可以自定义VS创建代理的方式,如本文所述: Customizing generated Web Service proxies in Visual Studio 2005

通过这种方式,您可以告诉VS使用您自己的类而不是生成代理类。

好吧,当我想起它时,它与Rob Cooper提出的几乎相同solution,只是一点点扭曲,你不会自己编写一个Facade图层,而是将VS本身用作这一层。