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

Thành Phan 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

Thành Phan

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...
Thành Phan viết 1 tháng 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ù...
Thành Phan viết 1 tháng trước
1 0
Bài viết liên quan
White
20 2
Chào các bạn Sau 1 khoảng thời gian làm việc theo hướng thiết kế micro services và domain driven design, tôi cảm thấy đây là một cách tư duy mới để...
Thang Nguyen viết 29 ngày trước
20 2
White
18 3
Đặt gạch Tháng 12 năm ngoái (2015) mình có một bài nói về DDD (Domain Driven Design) và kiến trúc Microservice ở Ruby Meetup. Mình sẽ viết lại khi...
Vu Nhat Minh viết 2 năm trước
18 3
{{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á!