2010-02-24 44 views
8

Tôi hiện đang bắt đầu trên DDD, tôi đã tìm thấy một triển khai tốt cho ValueObject nhưng tôi không thể tìm thấy bất kỳ triển khai tốt nào cho thực thể, tôi muốn một loại thực thể cơ sở chung sẽ có một ID (cần thiết bởi đặc tả) và thực hiện các hoạt động bình đẳng dòng.Thực hiện lớp DDD Entity trong C#

Whats giải pháp sáng suốt nhất?

Trả lời

18

Đặc điểm duy nhất của thực thể là nó có bản sắc lâu dài và (bán). Bạn có thể đóng gói và thể hiện điều đó bằng cách triển khai IEquatable<T>. Dưới đây là một cách để làm điều đó:

public abstract class Entity<TId> : IEquatable<Entity<TId>> 
{ 
    private readonly TId id; 

    protected Entity(TId id) 
    { 
     if (object.Equals(id, default(TId))) 
     { 
      throw new ArgumentException("The ID cannot be the default value.", "id"); 
     } 

     this.id = id; 
    } 

    public TId Id 
    { 
     get { return this.id; } 
    } 

    public override bool Equals(object obj) 
    { 
     var entity = obj as Entity<TId>; 
     if (entity != null) 
     { 
      return this.Equals(entity); 
     } 
     return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
     return this.Id.GetHashCode(); 
    } 

    #region IEquatable<Entity> Members 

    public bool Equals(Entity<TId> other) 
    { 
     if (other == null) 
     { 
      return false; 
     } 
     return this.Id.Equals(other.Id); 
    } 

    #endregion 
} 
+0

bạn có ý nghĩa gì khi bán kiên cố? – vorou

+0

+1. Đây có phải là cách tiếp cận bình thường cho một ứng dụng lớn không? Một câu hỏi tôi hỏi hôm nay là thu hút những lời chỉ trích về cách tiếp cận lớp cơ sở thực thể: https://softwareengineering.stackexchange.com/questions/364870/should-i-handle-all-nine-comparisons?noredirect=1#comment794683_364870. Tuy nhiên, nó hoạt động rất tốt cho chúng tôi. Nó thậm chí còn được mô tả là thiếu máu trong một trong những ý kiến. – w0051977

+0

@ w0051977 Tôi sẽ không viết như hôm nay. Đúng là đặc tính của một thực thể là nó là cùng một thực thể nếu nó có cùng một ID, nhưng việc thực thi 'Equals' không hữu ích trong các cơ sở mã thực tế. –

3

Đối với việc thực hiện các hoạt động bình đẳng đúng Tôi khuyên bạn nên có một cái nhìn vào một lớp cơ sở của các đơn vị miền trong Sharparchitecture - https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/EntityWithTypedId.cs. Nó đã thực hiện tất cả các chức năng cần thiết. Và có một cái nhìn trên một số mã khác ở đó, IMO, nó sẽ rất hữu ích cho bạn và trường hợp của bạn.

0

Tôi không chắc chắn liệu bạn có tuân theo một mã thư viện hoặc mã mẫu cụ thể hay hướng dẫn hay không. Một giải pháp DDD tốt sẽ sử dụng nhà máy để khởi tạo, liên tục tách biệt với mô hình miền (hầu hết ORM có xu hướng gộp hai nhóm lại với nhau), xác định rõ ràng ranh giới miền, thực thi các trường và thao tác thông qua giao diện.

Tôi rất muốn giới thiệu sách Áp dụng DDD và Mẫu sách của Jimmy Nilson. Nó thảo luận sâu về DDD và các phương pháp hay nhất. Các ví dụ trong C# cũng sẽ phù hợp với dự án của bạn.