程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> <<ABP框架>> 值對象,abp框架值對象

<<ABP框架>> 值對象,abp框架值對象

編輯:關於.NET

<<ABP框架>> 值對象,abp框架值對象


文檔目錄

 

本節內容:

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

簡介

“一個表示領域的一個描述性方面的沒有概念上的身份對象,稱為值對象。“(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);

即使它們在內存裡是不同的,對於我們的領域來說也是相同的。

 

最佳實踐

這裡有些關於值對象的最佳實踐:

  • 把值對象設計成不可變的(如上面的Address),如果沒有好的理由,不要把它設計成可變的。
  • 組成一個值對象的屬性應該形成一個概念上的整體。例如:CityId,Street和Number不應該被分離成Person的三個屬性,而且整個值對象也簡化了Person實體。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved