2009-07-27 82 views
4

我有一个复杂的数据类型,包括一些函数,以及通常的get和get方法。如果我可以使用WCF,我的生活将会相当容易,因此我的客户端也可以使用这种数据类型。我可以将WCF DataContract添加到复杂类型吗?

难道我

  1. 忽略所有的操作,把[DataMemeber]只在需要的地方。

  2. 将有问题的类放在共享库程序集中供客户端和服务器访问。

感谢, 罗伯托

PS。我意识到这个问题可能不是那么完美。

回答

3

好吧,事实证明,这是以上所有答案的组合。

  1. 将数据类粘贴到从客户端和服务器项目引用的共享程序集中。
  2. 确保您在“配置服务参考”对话框中选中了“引用装配中的重用类型”项目。
  3. 在每个数据合约的开始处放置一个[KnownType]属性。

代码看起来像这样:

[DataContract] 
[KnownType(typeof(WHS2SmugmugShared.Photo))] 
[KnownType(typeof(WHS2SmugmugShared.PhotoInfo))] 
public class Photo 
{ 
//code here 
} 

在上述情况下,我在照片类使用PhotoInfo。 PhotoInfo在类文件中没有与它关联的KnownType属性。它似乎并不需要。

这允许您序列化复杂类型,但仍然保持其操作。

3

所有通过WCF边界传输的都是序列化的 - 这相当于类的状态。方法不会。所以,如果你需要它们可用于双方,那么你需要一个共享库,如你所建议的。

当您添加服务引用时,您可以选择重用数据类型,在这种情况下,WCF将反序列化到共享类中,并使用方法完成。但只有实际上已经跨越边界转移的字段值。

+0

我假设这将在“配置服务引用”对话框?它设置为在所有引用的程序集中重用类型。它是否正确?? – 2009-07-27 12:05:13

0

简短的回答:是的。 WCF处理像冠军一样的复杂类型。在传递复杂类型时,您只需关注传递的数据。如果您的客户端不共享DLL,则更关注于传递的数据(而不是任何额外的操作),因为客户端只会获得复杂类型数据成员的副本。

我猜你是来自Java背景?使用WCF,您需要使用DataMember属性标记字段或(更好)将您的get/set方法更改为属性。

,而不是例如:

[DataContract] 
public class Foo 
{ 
    [DataMember] 
    private string bar; 

    public string GetBar() 
    { 
     return bar; 
    } 

    public void SetBar(string b) 
    { 
     bar = b; 
    } 
} 

您可以使用下列内容:

[DataContract] 
public class Foo 
{ 
    [DataMember] 
    public string Bar { get; set; } 
} 
1

的最佳实践资料合约是它是一个合同 - 只与无行为数据。第二种最佳做法是让你用[DataMember]装饰你的班级,并将其保留在服务器上 - 让客户端使用代理副本。

0

装饰所有具有可序列化属性的类型。因此,您不需要为参与WCF服务的每个复杂类放置[DataContract]属性。

在WCF客户端添加包含thoes类型的dll,让代理重用这些类,而不是重新生成deserilization所需的类。 如果任何类型被添加intoproxy删除它并使用从DLL。 通过这种方式,我可以轻松地在服务中共享我的复杂类型。 但它只适用于如果你可以将你的类型分离为单独的dll。

相关问题