2014-09-09 3 views
2

엔티티 사이의 차이 :빈혈 도메인 모델과 내가 DDD의 확고한 이해를 얻기 위해 노력하고 그들은 설명 줄리 러먼에서 도메인 기반 디자인 및 블로그에 에릭 에반스의 책을 읽은

Anemic Domain Model 클래스가 모델로 국가 관리에 중점을 둡니다. CRUD에 좋습니다.

Entity은 추적 및 보존에 사용되는 ID가있는 변경 가능한 클래스입니다.

분명히 둘 다 같은 목적으로 사용되었거나 완전히 스틱의 끝이 잘못 되었나요? 둘의 차이점은 무엇입니까? 나는 빈약 한 도메인 모델이 데이터베이스 스키마를 표현하기 위해 종종 사용되지만 엔티티에 대해서도 동일하지 않다는 것을 읽었습니다. 예를 들어

,있는 table라는 고객이의 모습 표현하기 나의 이해 anemic domain model에서

CustomerId int 
Forename varchar(50) 
Surname varchar(50) 
IsActive bit 

: 나를 위해

public class Customer 
{ 
    public int CustomerId { get; set; } 
    public string Forename { get; set; } 
    public string Surname { get; set; } 
} 

과거의 경험은 그 실체는 것 제안 이러한 방식으로 일련의 gettersetter 속성으로 표현 될 수 있습니다. 두 개념 (엔티티 및 빈혈 도메인 모델)은 모두 mutable입니까?

감사합니다.

+0

** 그들은 서로 다른 두 세계 출신입니다 ** ** 빈혈증 대 리치 도메인 모델 ** 또는 ** 데이터 전송 개체 대 엔티티/값 개체/집계 루트 **를 비교하는 것이 좋습니다. –

+0

다시 여기에서 우리가 어떻게 DTO/엔티티와 값 객체를 값 객체와 동일하게 취급 할 수 있는가? 엔티티와 DTO는 같지 않지만 어떻게 처리 할 수 ​​있는가? 상태를 변경하려면 허용됩니다. –

+0

빈혈 도메인 모델 및 DTO에는 아무런 행동이 없습니다. 풍부한 도메인 모델과 개체/값 개체/집계 루트가 있습니다. 엔티티, 값 객체 및 집계 루트는 다르지만 일반적으로 모두 동작을합니다. –

답변

2

DDD 고객 엔티티에 Customer :: changeName (Forename, Surname) ...이있을 수 있습니다.

changeName은 고객이 실제로 이름을 변경하는 경우에만 트리거됩니다. 그런 다음 새 이름을 처리하는 데 필요한 비즈니스 로직을 임베드합니다. 아마도 이전 이름으로 보류중인 주문이있을 수 있습니다. 어쩌면 새 이름으로 업데이트하려고 할 것입니다. 아마. 가능한 많은 것들.

나에게는 적어도 빈혈 도메인 개체와 DDD 엔터티 간의 기본적인 차이점은 엔터티가 실제로 속성을 업데이트하는 것 이상을 수행한다는 것입니다.

+0

풍부한 도메인 모델이 있습니다. 엔티티가 이것과 동등하다고 말하는 겁니까? 에릭 에반스 (Eric Evans)는 혼란이 발생한 두 곳을 구별합니다. –

+0

완벽하게 솔직히 말하면 저자 간의 미묘한 차이점을 파헤 치려고 많은 시간을 소비하지 않습니다. 평소 DDD 전문가들 중 누구도 나를 싫어했지만 아직 어떤 것이 격려하고 있습니다. 무슨 일이 일어나는지보아야합니다. – Cerad

+0

+1 엔티티의 메소드는 실제 상황에서 발생하고 응용 프로그램의 유비쿼터스 언어로 표현되는 이벤트를 반영해야합니다. 고객은 "자신의 거리를 X 및 도시 Y"로 설정하지 않고 "배달 정보를 변경"합니다. @Dr Schizo Eric Evans는 엔티티와 리치 도메인 모델을 어떻게 구별합니까? 엔티티는 리치 도메인 모델의 일부일뿐입니다. RDM은 도메인 계층 클래스 전체 (엔티티, 값 객체, 서비스)를 참조하는 방법 일뿐입니다. – guillaume31

1

[빈혈 도메인 모델은 종종 데이터베이스 스키마를 나타 내기 위해 사용되지만, 엔티티도 마찬가지입니다.

에반스의 책을 다시 읽어야 할 수도 있습니다.) DDD 엔티티는 리치 도메인 모델 접근 방식을 구현하는 한 가지 방법입니다. 엔티티는 응용 프로그램의 유비쿼터스 언어에서 참조되는 도메인 작업을 캡처한다는 점에서 부자입니다. 이러한 행동은 데이터 슬롯의 원자화되지 않은 수정과는 대조적으로 비즈니스 도메인에서 발생할 수있는 실제 이벤트를 인코딩합니다. 예를 들어 Order.Total 속성을 노출하고 바우처를 확인하고 전체를 업데이트하기 위해 외부 스크립트로 남겨 두는 대신 바우처 유효성을 확인하고 주문 총계를 다시 계산하는 Order.ApplyDiscountVoucher(...) 메서드를 사용할 수 있습니다.

또한 엔티티로 캡슐화 된 것은 엔티티 생성시 적용될 수있는 불변량을 강제 할 책임이 있습니다. 또는 누군가가 집합을 변경하려고 할 때마다 Aggregate Roots 엔티티에 적용 할 수 있습니다. 빈민가 모델에는 이러한 비즈니스 규칙이 내장되어 있지 않으므로 외부 절차에 부딪 힐 수 있습니다.

엔티티, 다른 도메인 개체 또는 빈혈 개체를 변경할 수 있어야하는지 여부는 완전히 직관적 인 문제입니다.

+0

위 섹션에서 강조한 부분은 Julie Lerner의 PluralSight 비디오 도메인 기반 디자인 기본 사항에서 온 것입니다. –

+1

그녀는이 질문을 매우 많이 제기 했습니까? 아니면 "엔티티에서 동일합니다"라고 말했습니까? 어쩌면 그녀는 DDD의 엔티티와 매우 다른 Entity Framework의 엔티티에 대해 이야기했을 것입니다. – guillaume31

+0

글쓴이 (Lerner and Smith)는 때로 빈혈 도메인 모델을 언급하면서 종종 데이터베이스 스키마를 나타 내기 위해 사용됩니다. 나는 그녀가 EF에 대한 옹호자라는 것을 알고 있습니다. 그래서 이것이 어디에서 왔을 수 있었는지, 따라서 저는 혼란 스럽습니다. 경계 다이어그램과 엔티티 부분이 어디에 있는지를 보여주는 다이어그램이 많은 것들을 설명한다고 생각합니다. –

관련 문제