C# 我应该直接绑定到从webservice返回的对象吗?
我应该直接绑定到从webservice返回的对象,还是应该将客户端对象绑定到gridcontrols?例如,如果我有一个返回对象Car的服务,我应该有一个客户端Car对象,并用webservice Car对象中的值填充它吗? 什么是最佳实践?C# 我应该直接绑定到从webservice返回的对象吗?,c#,web-services,data-binding,serialization,C#,Web Services,Data Binding,Serialization,我应该直接绑定到从webservice返回的对象,还是应该将客户端对象绑定到gridcontrols?例如,如果我有一个返回对象Car的服务,我应该有一个客户端Car对象,并用webservice Car对象中的值填充它吗? 什么是最佳实践? 在C#中,我需要将我的类标记为可序列化还是对它们做一些特殊的操作?这实际上取决于您从web服务中获得的内容。如果它们是简单的数据传输对象,并且您仅显示数据,则可以绑定。如果您计划编辑对象,它可能没有用处,因为您将需要跟踪更改 客户端上的对象和/或集合是否跟
在C#中,我需要将我的类标记为可序列化还是对它们做一些特殊的操作?这实际上取决于您从web服务中获得的内容。如果它们是简单的数据传输对象,并且您仅显示数据,则可以绑定。如果您计划编辑对象,它可能没有用处,因为您将需要跟踪更改 客户端上的对象和/或集合是否跟踪更改?如果是这样,你可以使用它们 如果没有更改跟踪,则需要自己跟踪更改,因此可能需要平移对象或将其包装在某些东西中以跟踪更改
再说一次,这真的取决于你得到了什么,他们支持什么,你对他们做了什么,以及服务器对更改的响应。您可以做的一件事是创建与web服务数据契约对应的客户端类,并使用您想要的任何附加功能,并将web服务引用设置为重用现有类型。那么就没有理由创建附加的包装类来绑定。如果直接绑定到Web服务类型,那么就是引入了耦合。如果Web服务将来发生更改,这可能会产生不希望的副作用,这意味着大量代码更改 例如,如果您今天使用的是.asmxweb服务,那么明天再转到WCF呢?如果您使用了WCF不会序列化的类型,那么这可能意味着代码中会有相当多的更改
从长远来看,最好创建特定的客户端对象,然后在Web服务数据契约类型之间进行转换。这似乎是一项艰巨的工作,但在进行重构时,这通常会得到很大的回报,因为您的更改都集中在一个地方。这是一个很好的问题,它遵循了我问自己的两个问题: 这两本书对你来说都是值得一读的 这是我的两个要点:
- 尽可能将Web服务的返回类型保留为原语。这不仅有助于减少消息的大小,而且还降低了接收端的复杂性
- 如果确实需要返回复杂对象,请将它们作为原始xml字符串返回(我将在下面解释)
汽车课程):
- 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使用自己的类,而不是生成代理类
当我想到我