리포지토리 패턴을 올바르게 사용하는 방법에 대해 머리를 숙이고 있습니다. 집계 루트의 중심 개념이 계속 나타납니다. 집계 루트가 무엇인지에 대한 도움을 얻기 위해 웹과 스택 오버플로를 모두 검색 할 때 기본 정의가 포함되어야하는 페이지에 대한 토론과 죽은 링크를 계속 찾습니다.
리포지토리 패턴의 맥락 에서 집계 루트 란 무엇입니까?
리포지토리 패턴을 올바르게 사용하는 방법에 대해 머리를 숙이고 있습니다. 집계 루트의 중심 개념이 계속 나타납니다. 집계 루트가 무엇인지에 대한 도움을 얻기 위해 웹과 스택 오버플로를 모두 검색 할 때 기본 정의가 포함되어야하는 페이지에 대한 토론과 죽은 링크를 계속 찾습니다.
리포지토리 패턴의 맥락 에서 집계 루트 란 무엇입니까?
답변:
리포지토리 패턴의 맥락에서 집계 루트는 클라이언트 코드가 리포지토리에서로드하는 유일한 개체입니다.
리포지토리는 하위 객체에 대한 액세스를 캡슐화합니다. 호출자의 관점에서 루트가로드되는 동시에 또는 실제로 필요할 때 (지연 한로드와 같이) 자동으로로드됩니다.
예를 들어 Order
여러 LineItem
개체 에 대한 작업을 캡슐화 하는 개체 가있을 수 있습니다 . 클라이언트 코드는 LineItem
객체를 직접 로드하지 않으며 객체 Order
가 포함 된 객체 만 도메인의 해당 부분에 대한 집계 루트가됩니다.
에반스 DDD에서 :
AGGREGATE는 데이터 변경을 목적으로하는 단위로 취급되는 관련 개체의 클러스터입니다. 각 AGGREGATE에는 근과 경계가 있습니다. 경계는 AGGREGATE 내부의 내용을 정의합니다. 루트는 AGGREGATE에 포함 된 단일의 특정 ENTITY입니다.
과:
루트는 외부 객체가 [.]에 대한 참조를 보유 할 수있는 AGGREGATE의 유일한 멤버입니다.
이는 집계 루트가 저장소에서로드 할 수있는 유일한 오브젝트임을 의미합니다.
예는 Customer
엔터티와 엔터티를 포함하는 모델 Address
입니다. 우리는 Address
모델과 관련된 엔터티가 없으면 모델에서 직접 엔터티에 액세스 하지 않습니다 Customer
. 그래서 우리는 말할 수 Customer
있고 Address
함께 집합체를 형성합니다. 그리고 그것은 Customer
집합체 루트입니다.
Each AGGREGATE has a root
와 The root is the only *member* of the AGGREGATE
-이 verbage를 루트가 집계에 속성입니다 것을 의미한다. 그러나 모든 예제에서 다른 방법은 다음과 같습니다. 루트에는 집계 속성이 포함됩니다. 당신은 명확히 할 수 있습니까?
Customer
클래스가 집계 루트 또는 Customer
인스턴스로 간주 됩니까?
집계 루트는 간단한 아이디어를위한 복잡한 이름입니다.
잘 설계된 클래스 다이어그램은 내부를 캡슐화합니다. 이 구조에 액세스하는 지점을이라고 aggregate root
합니다.
솔루션 내부는 매우 복잡 할 수 있지만이 계층의 사용자는을 사용 root.doSomethingWhichHasBusinessMeaning()
합니다.
차를 어떻게 타고 싶니? 더 나은 API 선택
옵션 A (어떻게 작동하는지) :
car.ride();
옵션 B (사용자는 클래스 inernals에 액세스 할 수 있음) :
if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
for (Wheel w: car:getWheels()){
w.spin();
}
}
그 옵션 A가 더 좋다고 생각하면 축하합니다. 당신은 뒤에 주요 이유가 있습니다 aggregate root
.
집계 루트는 여러 클래스를 캡슐화합니다. 기본 개체를 통해서만 전체 계층 구조를 조작 할 수 있습니다.
car
루트 를 집계 할 수 있어야 합니다. 도면에서와 같은 상황을 허용 할 수도 있습니다. 올바른 솔루션은 비즈니스 응용 프로그램 모델에 따라 다릅니다. 경우에 따라 다를 수 있습니다.
컴퓨터 엔터티가 있다고 가정하면이 엔터티는 소프트웨어 엔터티 및 하드웨어 엔터티 없이도 살 수 없습니다. 이들은 Computer
도메인의 컴퓨터 부분에 대한 미니 생태계 인 집합체를 형성 합니다.
집계 루트는 집계 내부의 모선 엔터티 (이 경우 Computer
)이며 저장소가 집계 루트 인 엔터티 만 작동하도록하는 것이 일반적이며이 엔터티는 다른 엔터티를 초기화합니다.
집계 루트를 집계의 시작점으로 고려하십시오.
C # 코드에서 :
public class Computer : IEntity, IAggregateRoot
{
public Hardware Hardware { get; set; }
public Software Software { get; set; }
}
public class Hardware : IEntity { }
public class Software : IValueObject { }
public class Repository<T> : IRepository<T> where T : IAggregateRoot {}
하드웨어도 ValueObject 일 수 있음을 명심하십시오 (자체적으로 ID가없는 경우).
where T : IAggregateRoot
-이것은 나의 하루를 만들었습니다
데이터베이스 우선 접근 방식을 따르는 경우 루트는 일반적으로 일대 다 관계의 1면에있는 테이블입니다.
가장 일반적인 예는 사람입니다. 각 사람은 많은 주소, 하나 이상의 급여 명세서, 송장, CRM 항목 등을 가지고 있습니다. 항상 그런 것은 아니지만 9/10 배입니다.
우리는 현재 전자 상거래 플랫폼에서 작업하고 있으며 기본적으로 두 가지 루트가 있습니다.
고객은 연락처 정보를 제공하고 거래를 할당하며 거래는 품목을 얻는 등
판매자는 제품을 판매하고 사람들에게 연락하며 페이지 정보, 특별 행사 등을 제공합니다.
이들은 각각 고객 및 판매자 저장소에 의해 처리됩니다.
디나 :
리포지토리 컨텍스트에서 집계 루트는 상위 엔터티가없는 엔터티입니다. 그것은 존재, 그것이 부모의 정체성에 의존하는 0, 하나 또는 많은 어린이 엔티티를 포함합니다. 그것은 저장소에서 일대 다 관계입니다. 이러한 아동 단체는 일반 집계입니다.
A로부터 깨진 링크 :
골재 안에는 골재 뿌리가 있습니다. 총계 루트는 총계 내의 다른 모든 엔티티 및 가치 개체에 대한 상위 엔터티입니다.
리포지토리는 집계 루트에서 작동합니다.
자세한 내용은 여기를 참조하십시오 .
집계는 액세스 사고 집계 루트를 제한하여 불변량을 보호하고 일관성을 유지하는 곳입니다. 집계는 데이터베이스 관계가 아닌 프로젝트 비즈니스 규칙 및 변형을 기반으로 설계해야합니다. 리포지토리를 주입해서는 안되며 쿼리는 허용되지 않습니다.
Erlang에서는 집합이 OO 구성 대신 상태 내부의 데이터 구조로 구성되면 집합을 구별 할 필요가 없습니다. 예를 참조하십시오 : https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london