Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Domain-Driven Design: Khác nhau giữa Entity và Value Object
Concept
Enity: Là object có kiểu là mutable . Object identity bằng key (key ở đây có thể là id hoặc GUID)
ValueObject: Là object mà được identity bằng tất cả các thuộc tính trong object đó. Compare 2 valueobject bằng cách compare tất cả các thuộc tính trong object nếu nó bằng nhau thì có thể nói 2 object đó là "equal".
Immutable: Là 1 kiểu mà khi đã khởi tạo thì các thuộc tính trong nó không thể thay đổi, trong C# ta có thể định nghĩa 1 object có kiểu là immutable bằng cách khai báo setter của các thuộc tính trong object là private.
Trong C# khi viết 1 object là value object nên kế thừa từ base class ValueObject ở đây: http://grabbagoft.blogspot.com/2007/06/generic-value-object-equality.html
Example
Nên dùng value object khi 1 số giá trị luôn phải đi cặp hay song song với nhau. VD đơn giản nhất là tiền tệ. Bởi vì khi nói đến tiền tệ (vd: 50000 VND) thì ta nói đến số lượng 50000 và đơn vị tiền tệ VND.
Thay vì viết:
public class Product
{
public string Name{get;set;}
public decimal Amount{get;set;}
public string Currency{get;set;}
}
Ta có thể viết thành:
public class Product
{
public string Name{get;set;}
public Money Price{get;set;}
}
public class Money
{
public decimal Amount {get;private set;}
public string Currency{get;private set;}
public Money(decimal amount, string currency)
{
Amount = amount;
Currency = currency;
}
}
Nếu có thể nên viết các business logic ở phía trong value object, khi code nên suy nghĩ có nên dùng value object hay không. VD phía trên class Money ta có thể định nghĩa thêm function chuyển đổi giá tiền từ mệnh giá này sang mệnh giá khác.
public class Money
{
public decimal Amount {get;private set;}
public string Currency{get;private set;}
public Money(decimal amount, string currency)
{
Amount = amount;
Currency = currency;
}
public Money ConvertMoney(string currency)
{
decimal newAmount = logic here ...
string newCurrency = logic here ....
return new Money(newAmount, newCurrency);
}
}
ThanhPhan 01-04-2018




