Domain-Driven Design: Khác nhau giữa Entity và Value Object
TIL
765
C#
28
Domain Driven Design
3
White

d3arSome1 viết ngày 31/03/2018

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

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

d3arSome1

4 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
1 0
Story Nay ngồi đọc cái partial method trong C thấy 2 cái này có gì đó giống nhau, có thể thay thế nhau Partial method Đại khái là khi định nghĩa...
d3arSome1 viết hơn 2 năm trước
1 0
White
1 0
Bài nãy sẽ được update thường xuyên Cần 1 email để nhận mail nhanh nhất có thể: https://www.mailinator.com Vừa coi video học frontend vừa code cùn...
d3arSome1 viết hơn 2 năm trước
1 0
Bài viết liên quan
White
0 0
Mình khá là lười, nên mình sẽ không đưa định nghĩa hay usage của reflection vào đây. Vì dù sao mình cũng sẽ chỉ copy thôi :smile:. Vậy nên chúng ta...
Rice viết 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
4 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!