领域驱动设计之代码优先-领域层设计-11 (翻译)

来源:互联网 发布:网络机房布线图 编辑:程序博客网 时间:2024/05/12 02:33

3.16.- 实现值对象

  值对象有下面的特征:

-  没有标识符的概念
-  有相同值的两个值对象视为相等
-  不可变

  一个值对象其实是一组属性。一个简单的.NET值对象可能如下。它还和EF代码优先不兼容,因为它像一个
复杂类型。注意我们怎样使它有不可变的特征。这可以初始化它的属性,之后它的属性就不能从外部修改:

//Sample .NET VALUE-OBJECT public class Address {     private readonly string _city;         private readonly string _zipCode;     private readonly string _addressLine1;     private readonly string _addressLine2;              public Address(string city, string zipCode,                     string addressLine1, string addressLine2                   )     {         _city = city;         _zipCode = zipcode;         _addressLine1= addressLine1;         _addressLine2= addressLine2;             }      public string City     {         get { return _city; }     }      public string ZipCode     {         get { return _zipCode; }     }      public string AddressLine1     {         get { return _addressLine1; }     }     public string AddressLine1     {         get { return _addressLine2; }     }     } 

  值对象没有标识符。问题是该值对象不能和EF代码优先一起工作。为了使它工作,但同时是不可变的。
这样,我们要做的是设置私有的set。
  
//Sample VALUE-OBJECT Complex-Type public class Address    : ValueObject<Address> {         public string City { get; private set; }     public string ZipCode { get; private set; }     public string AddressLine1 { get; private set; }     public string AddressLine2 { get; private set; }      public Address(string city, string zipCode,                     string addressLine1, string addressLine2)     {         this.City = city;         this.ZipCode = zipCode;         this.AddressLine1 = addressLine1;         this.AddressLine2 = addressLine2;     }  } 



  这样改值对象就可以和EF 4.1 代码优先工作,可以被存到数据库中。


  之后我们有另一个需要:两个有相同值的值对象应该视为相同。所以哦我们需要比较每个属性来做对比。我们可以
在每个值对象中实现比较方法,但是更好的方法是为值对象的基类添加特性,会在下节介绍。
原创粉丝点击