向WCF的DataContract对象添加方法

向WCF的DataContract对象添加方法,wcf,Wcf,WCF中的数据契约只不过是DTO吗?我正在读有关WCF的书,只是有一些想法。如果一些DataContract对象上可以有方法,这样客户机就可以在发送或检索回服务之前或之后使用它们做一些基本的事情,那就太好了 对我来说,这似乎不可能,也不符合逻辑。我可能错了,我每天都学新东西。因此,下一个最好的方法是将数据契约视为DTO,并为将从DTO创建真实对象的客户机提供库。将包含方法的对象 非常感谢您的指导。不确定我是否正确理解了您的答案,如果我错了,请纠正我 您可以使用DataContracts类创建类库

WCF中的数据契约只不过是DTO吗?我正在读有关WCF的书,只是有一些想法。如果一些DataContract对象上可以有方法,这样客户机就可以在发送或检索回服务之前或之后使用它们做一些基本的事情,那就太好了

对我来说,这似乎不可能,也不符合逻辑。我可能错了,我每天都学新东西。因此,下一个最好的方法是将数据契约视为DTO,并为将从DTO创建真实对象的客户机提供库。将包含方法的对象


非常感谢您的指导。

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

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


当您通过WCF在客户机和服务器之间传递这些对象时,状态将被持久化,但由于类库是共享的,所以两侧都有方法。

装饰为DataContract类的DTO是真正的对象。它们可以包含方法,但这些方法不是序列化过程的一部分

这将导致您出现问题的主要时间是:

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

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


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

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


因此,是的-最后,在WCF中从客户机到服务器的所有都是一条序列化消息-通常是XML格式。您不能用这种方法序列化行为或方法。

我可以知道,您希望您的客户在DataContract上做什么吗?我认为你可以在datacontract的构造函数中处理对象初始化逻辑。我真是个白痴。我完全忽略了显而易见的事实。我将测试它是否有效。如果您的客户端和服务都是.Net,那么您可以使用svcutil和/r选项生成客户端代理,以引用现有程序集。然后可以共享DataContracts的类。@Pratik也可以使用Visual Studio生成工具完成此操作吗?@didibus我相信您可以使用“在所有引用的程序集中重用类型”选项,尽管我目前无法确认。是的,确保您已经在客户端中将引用添加到包含服务器的
DataContract
(POCO数据传输组件)的程序集,然后在WCF服务引用向导左下角的
高级
位中选择
引用程序集中的重用类型
选项。@slugser,我也想到过的部分类解决方案。在大多数情况下,我将能够提供共享库。对于其他更安全的东西,我将使用webservice,我将确保我的对象保持简单。@slugster,关于在DataContract中具有某些逻辑的属性的一点。属性getter在序列化时调用,setter在服务端的反序列化时调用。所以,即使代理不运行逻辑,它也会在对象到达服务时运行。