文檔目錄
本節內容:
簡介
“一個表示領域的一個描述性方面的沒有概念上的身份對象,稱為值對象。“(Eric Evans)。
與一個有身份(Id)實體相反,一個值對象沒有身份。如果兩個實體的身份(Id)不同,它們被認為是不同對象/實體,即使其它所有的屬性都相同。比如兩個不同的Person實體,它們的Name、Surname和Age相同,如果它們的Id不同,我們就認為這是兩個不同的Person。但是,對於一個Address(地址,一個經典的值對象)類,如果兩個地址有相同的國家、城市、街道號碼等,它們就被認為是同一個address對象。
在DDD裡,值對象是另一種類型的領域對象,它可以包含業務邏輯和領域的要素。
值對象基類
為可簡單地創建值對象類型,可以繼承ABP的ValueOjbect<T>基類,例如Address值對象類型:
public class Address : ValueObject<Address> { public Guid CityId { get; private set; } //A reference to a City entity. public string Street { get; private set; } public int Number { get; private set; } public Address(Guid cityId, string street, int number) { CityId = cityId; Street = street; Number = number; } }
ValueObject基類重寫了相等操作符(==,和其它相關的操作符和方法),用來比較兩個值對象,如果所有屬性都是相同的,那麼就認為這兩個值對象是相同的。所以這些測試都可以通過:
var address1 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", 42); var address2 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", 42); Assert.Equal(address1, address2); Assert.Equal(address1.GetHashCode(), address2.GetHashCode()); Assert.True(address1 == address2); Assert.False(address1 != address2);
即使它們在內存裡是不同的,對於我們的領域來說也是相同的。
最佳實踐
這裡有些關於值對象的最佳實踐: