我可以将WCF DataContract添加到复杂类型吗?

时间:2009-07-27 11:24:32

标签: c# .net wcf visual-studio datacontract

我有一个复杂的数据类型,包括许多函数,以及通常的get和get方法。如果我可以使用WCF,我的生活会变得相当容易,所以我的客户也可以使用这种数据类型。

  1. 忽略所有操作,仅将[DataMemeber]放在需要的地方。

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

  3. 谢谢, 罗伯特

    PS。我意识到这个问题的措辞可能不尽如人意。

5 个答案:

答案 0 :(得分:3)

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

添加服务引用时,您可以选择重用数据类型,在这种情况下,WCF将反序列化为共享类,并使用方法。但它只是实际跨越边界传递的字段值。

答案 1 :(得分:3)

好的,结果证明是上述所有答案的组合。

  1. 将数据类粘贴到从客户端和服务器项目引用的共享程序集中。
  2. 确保在“配置服务引用”对话框中选中了“参考程序集中的重用类型”项。
  3. 在每个数据合同开始时,输入[KnownType]属性。
  4. 代码如下:

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

    在上面的例子中,我在Photo类中使用PhotoInfo。 PhotoInfo在类文件中没有与其关联的KnownType属性。而且似乎并不需要。

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

答案 2 :(得分:1)

数据合同的最佳做法是将其作为合同 - 只有没有行为的数据。第二个最佳实践是使用[DataMember]装饰您的类,并将其保留在服务器上 - 让客户端使用代理副本。

答案 3 :(得分:0)

简短回答:是的。 WCF处理像champ这样的复杂类型。传递复杂类型时,您只想关注传递的数据。如果您的客户端不共享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; }
}

答案 4 :(得分:0)

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

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