我有一个类,它的属性引用了几个接口和类。
现在我正在尝试通过WCF (命名管道)传输这个类,最好的处理方法是什么?
应该进入所有引用的接口,类,并将内容标记为<DataContract()>, <Serializable()> and <DataMember()>,这意味着至少要更改6-10个类。
有没有其他可行的方法来解决这个问题?这些接口和类在主机和客户端中都是共享的。它们使用的是完全相同的DLL。
发布于 2009-10-19 15:23:59
不要使用这种复杂的类型-创建一个没有依赖项的新数据协定类型,并通过网络发送该类型。然后创建一个接受此数据契约的操作契约,并将该数据契约映射到您现有的类型。由于您正在共享程序集,因此您可以确保将数据协定映射到复杂类型的逻辑位于共享程序集中,以便连接的两端都可以访问它。
附注:你确定这是最好的方法吗?当服务彼此解耦,并且听起来你的服务对彼此了解太多时,WCF工作得最好。
发布于 2009-10-20 00:23:15
WCF不会“传输类”-它会将参数序列化为(基于文本的)消息,然后在另一端再次反序列化。
您想要传输的任何东西都必须是可序列化的,并且必须以XML模式表示-您不能传输泛型或接口-只能传输具体类型。
我同意Andrew Hare的观点--为你的WCF服务创建单独的类,并将你当前的类映射到那些传输类中(使用像AutoMapper这样的东西可以让你的工作变得更容易)。
Marc
发布于 2009-10-19 15:31:08
您可以使用参数调用DataContractSerializer (无需在类中指定任何内容),或者在应用程序配置文件中为这些参数创建一个条目--请参阅:
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx
http://msdn.microsoft.com/en-us/library/ms731073.aspx
http://msdn.microsoft.com/en-us/library/ms731809.aspx
然而,我更希望在类级别定义契约。这是一次性的努力,肯定会有回报的。如果您的类真的太复杂,您可以从它派生另一个类,并在那里定义您感兴趣的DataContracts和DataMembers。
https://stackoverflow.com/questions/1589334
复制相似问题