我应该直接绑定到从webservice返回的对象,还是应该有我绑定到gridcontrols的客户端对象?例如,如果我有一个返回对象的服务Car应该有一个客户端Car对象,我使用webservice Car对象的值填充? 什么是最佳实践? 在C#中,我是否需要将我的类标记为可序列化或对它们执行一些特殊操作?
答案 0 :(得分:2)
这是一个很好的问题,它跟我自己提出的两个问题一样:
这些都值得为您阅读。
继承我的两位:
然后我做的是创建一个单独的类来表示对象并处理它的xml。我确保可以轻松地将类实例化并序列化为xml。然后,两个项目(Web服务和客户端)都可以使用具体对象引用DLL,但是没有与代理类的恼人耦合。如果您有共享代码,这种耦合会导致问题。
例如(使用Car
类):
CarFactory
)方法BuyCar(string make, string model)
是一种返回汽车的工厂方法。Mechanic
类,用于修复Car
个对象,这是在不了解Web服务的情况下开发的。Garage
课程。您为CarFactory
服务添加了一个Web引用以获取您的汽车,然后将一些Mechanic
添加到您的车库,然后破解您的指关节并准备从工厂获得一些汽车来获取它们工作。CarFactory.BuyCar("Audi", "R8")
的结果,然后告诉你的Mechanic.Inspect(myAudi)
编译器呻吟,因为Car
实际上是CarFactory.Car
类型而不是原始Car
类型,是吗?所以,使用我建议的方法:
Car
类。添加实例化方法并分别从/将其序列化为XML。CarFactory
网络服务,添加对DLL的引用,像以前一样构建您的汽车,但不是返回对象,返回XML 。Garage
添加对Mechanic
,Car
DLL和CarFactory
网络服务的引用。调用您的BuyCar
方法,现在它返回一个字符串,然后将此字符串传递给Car
类,该类重新构建其对象模型。 Mechanic
也可以愉快地处理这些Car's
,因为所有内容都是用同一个赞美诗(或DLL)演唱的。)注意:通常,创建一个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本身用作这一层。