WCF - 在DataContract构造函数中实例化对象

Asd*_*dfg 7 wcf constructor datacontract

我有两个课程如下:

[DataContract]
public class Address
{
   [DataMember]
   public string Line1
   [DataMember]   
   public string Line2
   [DataMember]
   public string City
   [DataMember]
   public string State
   [DataMember]
   public string Zip
}

[DataContract]
public class Customer
{
   public Customer()
   {
      CustomerAddress = new Address();
   }

   [DataMember]
   public string FirstName
   [DataMember]
   public string LastName
   [DataMember]
   public Address CustomerAddress
}
Run Code Online (Sandbox Code Playgroud)

如果我生成使用Customer类的服务代理,会发生什么?如果我理解正确的概念,那么我认为Customer类中的构造函数不会在客户端调用,它可能会给出不同的行为.

我如何摆脱Customer类中的构造函数,仍然具有CustomerAddress类型的属性Address,使其表现为一个愚蠢的DTO对象?

人们用来避免这种情况的一般准则或最佳做法是什么?

Dav*_*ter 6

如果您使用默认值DataContractSerializer来序列化对象,那么,是的,您的构造函数未被序列化,并且当反序列化对象时,客户端将不会调用您可能具有的任何逻辑.

关于你关于删除构造函数逻辑和Address填充嵌套类的问题,将由你来处理DataContractSerializer.如果我有这样的代码:

Customer c = new Customer() { 
  FirstName = "David",
  LastName = "Hoerster",
  CustomerAddress = new Address() {
    Line1 = "1 Main Street",
    City = "Smallville",
    State = "AA",
    Zip = "12345"
  }
};
Run Code Online (Sandbox Code Playgroud)

然后从服务方法返回该Customer对象,该对象将与Address信息一起正确序列化.生成的客户端上的代理将知道Address并将能够反序列化来自服务方法的流以正确构建Customer对象.你Customer将是一个虚拟的DTO - 没有逻辑,只有属性.

查看Aaron Skonnard 关于WCF序列化的MSDN文章,其中他谈到了DataContractSerializer.