为WCF的DataContract对象添加方法

时间:2010-09-17 09:36:02

标签: wcf

WCF中的DataContracts只不过是DTO吗?我正在阅读有关WCF的内容,并且有一些想法。如果一些DataContract对象可以在它们上面有方法,那么客户端可以在发送或检索回服务之前或之后用它们做基本的事情。

对我而言,这似乎不太可能或不符合逻辑。我错了,我每天都在学习新事物。那么下一个最好的事情是将DataContracts视为DTO,并为将从DTO创建真实对象的客户端提供库。包含方法的对象。

任何指导都会非常感激。

4 个答案:

答案 0 :(得分:9)

不确定我是否正确理解了你的答案,如果我错了,请纠正我。

您可以使用DataContracts类创建一个类库,并在客户端和服务器之间共享库。这样,标记为[DataContract]的类将具有方法(行为)和[DataMember]字段/属性(状态)。

当您通过WCF状态在客户端和服务器之间传递此类对象时,将保持状态,但由于共享了类库,因此您将在两端都有方法。

答案 1 :(得分:4)

装饰为DataContract类的DTO是真实对象。他们可以使用中的方法,但这些方法不是序列化过程的一部分

导致问题的主要时间是:

  • 您依赖于生成的DataContract对象的代理版本(例如,当您有一个调用WCF服务的Silverlight客户端,或者您正在调用您无法访问该代码或其库的第三方服务时)。生成的代理版本将不包含其中的方法,只有DataMember属性。绕过它的方法是使用共享库中的对象(如@Insomniac已经提到的那样)。

  • DataContract对象中的属性不仅仅是一个简单的get / set操作,即在设置属性值时可能包含了一些逻辑来执行其他操作。在这种情况下,即使代理生成的版本也不会包含该逻辑。解决这个问题的方法是要么拥有共享库,要么在客户端有一个扩展代理生成类的部分类。

答案 2 :(得分:0)

在客户端和服务器项目之间共享类是可行的方法。不要忘记检查服务引用,它尝试重用引用程序集中的类型。这样,服务引用不会为共享对象生成代理类。

答案 3 :(得分:0)

WCF的核心是基于消息的系统:您的客户端代理捕获对方法的调用,将方法及其所有参数包装到序列化消息中,并通过网络将其发送到要处理的服务。

是的 - 最后,WCF中从客户端到服务器的全部序列化消息 - 通常是XML格式。您无法使用此方法序列化行为或方法。