3

我有一个包含对象和数据访问代码的框架。这些对象使用 NHibernate 映射到数据库。

例如我的框架有类客户和订单:

public class Customer
{
      private Guid _id;
      private string _name;
      private IList<Order> _orders;

      public properties...
}


public class Order
{
     private Guid _id;
     private string _orderNumber;

     public properties...
}

我还有一个带有 PersistCustomer 方法的 WCF 服务。像这样:

[ServiceContract]
public interface ICustomerService
{

      [OperationContract]
      void PersistCustomer(Customer customer);
}

这个 WCF 引用了我的框架库。

我为 WCF 服务(一个简单的控制台应用程序)创建了一个客户端应用程序,它可以工作!

我无法理解的主要事情:为什么它可以在不将框架中的类装饰为 DataContract 并将它们的属性装饰为 DataMembers 的情况下工作?我应该装饰它们吗?

谢谢

4

2 回答 2

3

你不必这样做,但你应该这样做。特定的契约声明允许您控制类在网络上的序列化方式,允许您隐藏属性、重新排序消息中的属性、使某些属性为可选、某些为强制性,并控制数据契约的命名空间。

如果您不这样做,那么 .NET 会对其进行一个不错的猜测,但在某些时候您将需要控制,例如,如果您向一个类添加了一个新属性但希望旧客户端工作,您可以将其作为可选成员数据合同,老客户将继续工作。

于 2009-08-28T13:24:44.643 回答
3

由于在 .NET 3.5 SP1 中添加了对普通旧 C# 对象 (POCO) 的显式支持,您的类可以很好地序列化。

这可能是出于两个原因添加的:

  • 向后兼容 ASMX 服务
  • 简化 WCF 入门

可以在 Aaron Skonnards文章 DataContracts without attributes (POCO support) in .NET 3.5 SP1中找到一个很好的总结。

但是,就像@blowdart 提到的那样,您应该装饰您的 DataContracts,这将迫使您使用 DataMember,以便在序列化期间明确。迟早您将需要更改 DataContract,并且您可能需要保持与现有客户端的向后兼容性。

于 2009-08-28T13:40:15.467 回答