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

本文深入探讨了.NET值对象的特性和如何实现它们与EF代码优先的兼容性,包括不可变性、属性封装以及如何通过比较属性来判断对象相等。同时,文章还介绍了如何在值对象中添加比较方法,使其能够与EF4.1代码优先工作,进而实现在数据库中的存储。

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 代码优先工作,可以被存到数据库中。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值