2010-02-24 5 views
8

저는 DDD를 시작했습니다. ValueObject에 대한 좋은 구현을 이미 찾았지만 엔티티에 대한 좋은 구현을 찾지 못하는 것 같습니다. 일반적인 기본 엔터티 유형이 필요합니다. ID (명세에 의해 필요함)와 currect equality operations을 구현한다.C#에서 DDD 엔터티 클래스 구현하기

가장 훌륭한 솔루션은 무엇입니까?

답변

18

엔티티의 유일한 특성은 수명이 오래되고 (준) 영구적 인 특성입니다. IEquatable<T>을 구현하여 캡슐화하고 표현할 수 있습니다. - https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/EntityWithTypedId.cs 올바른 평등 작업의 구현을 위해

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

반영구적으로 무엇을 의미합니까? – vorou

+0

+1. 대형 앱의 일반적인 접근 방식입니까? 제가 오늘 질문 한 질문은 Entity 기본 클래스 접근법에 대한 비판을 불러 모으고 있습니다 : https://softwareengineering.stackexchange.com/questions/364870/should-i-handle-all-nine-comparisons?noredirect=1#comment794683_364870. 그러나, 그것은 우리를 위해 아주 잘 작동합니다. 그것은 의견 중 하나에서 빈혈로 묘사되었다. – w0051977

+0

@ w0051977 오늘은 그렇게 쓰지 않을 것입니다. Entity의 특성은 동일한 ID를 가진 경우 동일한 Entity이지만, Equals의 구현은 실제 코드 기반에서는 도움이되지 않는다는 것이 사실입니다. –

3

내가 Sharparchitecture에서 도메인 엔티티의 기본 클래스에 대한보고를하는 것이 좋습니다 : 여기 한 가지 방법이다. 그것은 모든 필수 기능의 구현을 가지고 있습니다. 그리고 IMO에서 다른 코드를 살펴보십시오. 여러분과 여러분의 경우에 매우 유용 할 것입니다.

0

특정 라이브러리/샘플 코드 또는 가이드 라인을 따른다면 확실하지 않습니다. 좋은 DDD 솔루션은 인스턴스화, 도메인 모델과 분리 된 지속성 (대부분의 ORM은 둘을 함께 묶는 경향이 있음), 도메인 경계를 명확하게 정의하고, 인터페이스를 통해 필드 및 작업을 시행하도록 factory를 사용합니다.

Jimmy Nilson의 DDD 및 패턴 적용 책을 강하게 권합니다. DDD 및 모범 사례에 대해 자세히 설명합니다. 예제는 프로젝트에 적합한 C#에도 있습니다.