您的位置:首页 > 编程语言

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

2013-03-21 10:12 435 查看
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 代码优先工作,可以被存到数据库中。

之后我们有另一个需要:两个有相同值的值对象应该视为相同。所以哦我们需要比较每个属性来做对比。我们可以

在每个值对象中实现比较方法,但是更好的方法是为值对象的基类添加特性,会在下节介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: