1. 程式人生 > >ABP官方文檔翻譯 3.2 值對象

ABP官方文檔翻譯 3.2 值對象

-s str 如果 相等 bject 實踐 編號 整體 經典

值對象

  • 介紹
  • 值對象基類
  • 最佳實踐

介紹

  "展現領域描述性層面且沒有概念性身份的對象稱之為值對象。"(Eric Evans)。

  和實體相反,實體有身份標示(Id),值對象沒有身份標示。如果兩個實體的身份標示是不同的,那麽就認為他們是不同的對象/實體,即使他們的所有屬性都是一樣的。考慮兩個不同的人有相同的名字、姓氏和年齡,但是他們是不同的人,如果他們的身份編號不同的話。但是,對於一個地址(經典的值對象)類,如果兩個地址有相同的國家、城市、街道編號等等,則認為為相同的地址。

  在DDD中,值對象是領域對象的另一種類型,可以包含業務邏輯,是領域的重要組成部分。

值對象基類

  ABP有一個ValueObject<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; } }

  值對象基類重寫了等於操作符(還有其他相關的操作符和方法)來比較兩個值對象,如果兩個值對象所有的屬性都相等則認為他們是相等的。所以,所有下面的測試都是通過的:

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);

  即使在內存中是不同的對象,在我們的領域中也認為他們是完全相同的。

最佳實踐

  一些值對象的最佳實踐:

  • 將值對象設計為不可變的(如上面的Address類),如果沒有好的理由將它設計為可變的話。
  • 組成值對象的屬性應形成一個概念上的整體。例如,CityId、Street和編號不應該是一個Person實體分離的屬性。這也使得Person實體更簡單。

返回主目錄

ABP官方文檔翻譯 3.2 值對象