本人是ABP初學者,在看英文文檔和@tkb至簡 的ABP框架理論研究總結(典藏版)時,發現大神@tkb至簡中少了對Value Objects的翻譯,看文檔是新的,大神沒時間把,小弟給補充上。 介紹 值對象基類 最佳實踐 介紹 值對象基類 最佳實踐 介紹 “用於描述領域的某個方面而本身沒有概念標識的對 ...
本人是ABP初學者,在看英文文檔和@tkb至簡 的ABP框架理論研究總結(典藏版)時,發現大神@tkb至簡中少了對Value Objects的翻譯,看文檔是新的,大神沒時間把,小弟給補充上。
介紹
“用於描述領域的某個方面而本身沒有概念標識的對象稱為 a VALUE OBJECT”(Eric Evans)
對於實體是相反的,實體有它們的表示(id),一個值對象沒有標識。如果兩個實體的標識不相同,即使它們所有的其他實體屬性是一樣的,它們也被稱為不同的對象/實體。想象一下,兩個不同的人擁有相同的名字、姓氏和年齡,但是他們擁有不同的身份證號,他們就是不同的人。但是,對於一個地址(它是一個經典的值對象)類,如果兩個地址是相同的國家、城市、街道號碼...等等,也被稱為同樣的地址。
在領域驅動模型中(DDD),值對象是領域對象的另一種類型,它能包含業務邏輯,它是領域必不可少的一部分。
值對象基類
在ABP中,可以很簡單的就創建值對象類型。ABP有一個ValueObject<T>基類,繼承它就可以了。示例,地址 值對象 類型:
public class Address : ValueObject<Address> { public Guid CityId { get; private set; } //引用城市實體. 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; } }
假設兩個值對象所有的屬性都是一致的,值對象基類的重寫equality操作(和其他相關操作和方法)來比較兩個值對象。 那麼,所有這些測試都通過:
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);
即使它們在記憶體中,是不同的對象。在我們的領域中也是相同的。
最佳實踐
在這裡有一些對於值對象最佳的實踐
- 如果沒有一個充分的理由設計值對象是易變的話,那最好設計一個值對象是不可變的(像地址這樣的)。
- 從整體概念上講,屬性組成一個值對象。例如,在一個人類實體屬性中,不應該獨立城市ID、街道和編號。同時,它使人類實體更加簡單。