C# 我应该直接绑定到从webservice返回的对象吗?

C# 我应该直接绑定到从webservice返回的对象吗?,c#,web-services,data-binding,serialization,C#,Web Services,Data Binding,Serialization,我应该直接绑定到从webservice返回的对象,还是应该将客户端对象绑定到gridcontrols?例如,如果我有一个返回对象Car的服务,我应该有一个客户端Car对象,并用webservice Car对象中的值填充它吗? 什么是最佳实践? 在C#中,我需要将我的类标记为可序列化还是对它们做一些特殊的操作?这实际上取决于您从web服务中获得的内容。如果它们是简单的数据传输对象,并且您仅显示数据,则可以绑定。如果您计划编辑对象,它可能没有用处,因为您将需要跟踪更改 客户端上的对象和/或集合是否跟

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

这实际上取决于您从web服务中获得的内容。如果它们是简单的数据传输对象,并且您仅显示数据,则可以绑定。如果您计划编辑对象,它可能没有用处,因为您将需要跟踪更改

客户端上的对象和/或集合是否跟踪更改?如果是这样,你可以使用它们

如果没有更改跟踪,则需要自己跟踪更改,因此可能需要平移对象或将其包装在某些东西中以跟踪更改


再说一次,这真的取决于你得到了什么,他们支持什么,你对他们做了什么,以及服务器对更改的响应。

您可以做的一件事是创建与web服务数据契约对应的客户端类,并使用您想要的任何附加功能,并将web服务引用设置为重用现有类型。那么就没有理由创建附加的包装类来绑定。

如果直接绑定到Web服务类型,那么就是引入了耦合。如果Web服务将来发生更改,这可能会产生不希望的副作用,这意味着大量代码更改

例如,如果您今天使用的是.asmxweb服务,那么明天再转到WCF呢?如果您使用了WCF不会序列化的类型,那么这可能意味着代码中会有相当多的更改


从长远来看,最好创建特定的客户端对象,然后在Web服务数据契约类型之间进行转换。这似乎是一项艰巨的工作,但在进行重构时,这通常会得到很大的回报,因为您的更改都集中在一个地方。

这是一个很好的问题,它遵循了我问自己的两个问题:

  • 这两本书对你来说都是值得一读的

    这是我的两个要点:

    • 尽可能将Web服务的返回类型保留为原语。这不仅有助于减少消息的大小,而且还降低了接收端的复杂性
    • 如果确实需要返回复杂对象,请将它们作为原始xml字符串返回(我将在下面解释)
    然后我要做的是创建一个单独的类,它表示对象并处理它的xml。我确保该类可以很容易地从xml实例化并序列化为xml。然后,两个项目(web服务和客户机)都可以使用中的具体对象引用DLL,但没有与代理类的恼人耦合。如果您有共享代码,这种耦合会导致问题

    例如(使用您的
    汽车
    课程):

    • Web服务(
      CarFactory
      )方法
      BuyCar(字符串make,字符串model)
      是返回汽车的工厂方法
    • 您还编写了一个
      mechanical
      类,该类处理
      Car
      对象来修复它们,这是在不了解Web服务的情况下开发的
    • 然后为应用程序指定一个
      Garage
      类。您可以添加一个对
      汽车工厂
      服务的web引用来获取您的汽车,然后在车库中添加一些
      技工
      ,然后敲打您的指关节,准备从工厂获取一些汽车,让它们继续工作
    • 当你得到汽车工厂的结果时,一切都结束了。买汽车(“奥迪”,“R8”)
    ,然后告诉你的
    技工。检查(我的奥迪)
    编译器呻吟,因为
    汽车实际上是
    汽车工厂的类型。汽车
    不是原来的
    汽车
    类型,是吗 因此,使用我建议的方法:

    • 在自己的DLL中创建
      Car
      类。添加方法以分别从/到XML对其进行实例化和序列化
    • 创建
      CarFactory
      web服务,添加对DLL的引用,像以前一样构建汽车,但不是返回对象,而是返回XML
    • 创建
      车库
      添加对
      技工
      汽车
      DLL和
      汽车工厂
      web服务的引用。调用
      BuyCar
      方法,现在它返回一个字符串,然后将该字符串传递给
      Car
      类,该类重新构建其对象模型。
      技工也可以愉快地处理这些
      汽车的
      ,因为所有的东西都是从同一张赞美诗(或DLL)中唱出来的:)
    • 一个主要的好处是,如果对象的设计发生了变化,您所需要做的就是更新DLL,web服务和客户端应用程序将与该过程完全解耦
    注意:然后创建第二层,使用web服务并从XML结果自动生成对象,通常会很有用


    我希望这是有意义的,如果没有,请大声喊叫,我会澄清。

    如果您是web服务和客户端的所有者。
    您需要web服务调用的参数是复杂的类,这些类不仅包含数据,而且还包含行为(实际的编码逻辑),那么在使用web服务框架开发这些web服务时,您就有点麻烦了。
    正如中所建议的,您可以使用纯xml作为web服务参数和xml序列化,但有一个更干净的解决方案。
    如果您使用的是Visual Studio 2005(可能对2008也适用相同的方法),则可以自定义VS创建代理的方式,如本文所述:

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

    当我想到我