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 代码优先工作,可以被存到数据库中。
之后我们有另一个需要:两个有相同值的值对象应该视为相同。所以哦我们需要比较每个属性来做对比。我们可以
在每个值对象中实现比较方法,但是更好的方法是为值对象的基类添加特性,会在下节介绍。