2017-09-27 2 views
3

DDD에서는 리포지토리가 집계의 직렬화 및 역 직렬화를 수행하는 데 사용됩니다. 데이터베이스를 읽고 쓸 수 있습니다. 이렇게하면 집계에 순수한 비즈니스 논리가 포함될 수 있으며 도메인이 아닌 지속성 전략과 결합되지 않습니다.리포지토리가 도메인 기반 디자인의 집계에만 사용되는 이유는 무엇입니까?

그러나 저장소가 항상 집합체 인에 사용되는 것으로 묘사 된 이유가 궁금합니다. 그것을 모든 단체에 동등하게 동기 부여하는 것이 아닌가?

(모든 일반 실체가 제로 아이들과 함께 집계 뿌리로 볼 수있다는 사실의 문제의 경우,이의 저를 통지하고, 질문에 묻혀 할 수 있습니다하시기 바랍니다.)

+1

마지막 문장이 정확합니다. 나는이 책을 읽었고 하나의 엔티티가 자식이없는 집합 루트가 될 수 없으므로 리포지토리에 저장 될 수있는 유력한 후보자이기도합니다. –

+1

모두 동의합니다. 엔티티에는 자체 수명주기 및 자체 ID가 있습니다. 그러므로, 그것은 검색되고 운영 될 수 있습니다. 이것을 보는 또 다른 방법은 저장소가 엔티티를 반환한다는 것입니다. 해당 엔티티는 다른 오브젝트를 수집 할 수도 있고 그렇지 않을 수도 있습니다. 저장소가 검색하는 내용 : 파란색 책에 내부 표지에 저장소가 엔터티 및/또는 AR을로드하는 이미지가 있음을 확신합니다. –

답변

5

궁금 왜 리포지토리가 항상 집계에 사용되는 것으로 묘사되는지. 그것을 모든 단체에 동등하게 동기 부여하는 것이 아닌가?

집계는 응용 프로그램 계층에 노출되는 일관성 경계입니다.

즉, 리포지토리는 데이터 저장소에서 상태의 스냅 샷을 가져 와서 집계를 구성하는 엔티티와 값의 그래프를 작성해야합니다.

리포지토리의 API는 일관성 경계를 정의하기 때문에 집계 루트 만 노출합니다. 응용 프로그램이 그래프의 임의의 위치에 도달하여 변경하도록하는 대신 응용 프로그램이 루트 객체와 독점적으로 통신하도록합니다. 이 제한 조건을 적용하면 모든 변경 사항이 비즈니스 불변성을 충족시키는 지 확인하기 만하면됩니다.

따라서 응용 프로그램이 해당 미세 입자에서 모델과 직접 상호 작용할 수 없기 때문에 모델의 각 엔터티 유형에 대한 리포지토리를 개발할 필요가 없습니다.

다른 말로하면, 집합 내의 엔티티는 개인 데이터 구조입니다. 우리는 클라이언트가 api를 지나서 포인터를 직접 조작 할 수있는 목록을 구현하지 않는 것과 같은 이유로 엔티티를 직접 조작하도록 클라이언트 코드를 허용하지 않습니다. 저장소는 모델의 상태의 캐시 된 뷰를 검색 할 수 있습니다 -

에서는 골재 이외의 작업에 사용되는 "저장소"를 참조 할 . 트릭은보기가 수정을 지원하지 않는다는 것입니다. Evans가 설명하는 접근 방식에서 각 엔터티는 모든 역할을 수행하는 하나의 단일 표현을가집니다. CQRS에서 엔티티는 각 역할마다 서로 다른 표현을 가질 수 있지만 일반적으로 엔티티 수정을 지원하는 역할은 하나뿐입니다.

1

DDD에는 두 가지 종류의 엔티티가 있습니다. 골재 루트와 중첩 엔티티입니다. @VoiceOfUnreason이 대답 했으므로 집계 외부에서 중첩 엔티티를 수정할 수 없으므로 리포지토리를 가질 필요가 없습니다 ("리포지토리"에 의해로드 용 인터페이스를 참조하고 엔티티 상태를 유지). 만약 당신이 허용된다면, OOP에서 가장 중요한 것들이 있다면 Aggregate의 encapsulation을 깨뜨릴 것입니다. 캡슐화는 DDD가 가장 적합한 모델을 많이 사용하여 풍부한 도메인을 지원합니다.

관련 문제