2016-07-19 1 views
1

나는 여전히 DDD를 조사하고 있지만 잠재적 인 한 가지 함정에 대해 알고 싶어합니다.DDD (Domain Driven Design) 및 데이터베이스 생성 보고서

DDD에 따르면 aggregate-root는 지속성을 알아야하지 않지만 전체 aggregate-root가 메모리에서 인스턴스화되는 것을 의미하지는 않습니다.

예를 들어 집계 - 루트는 지속성을 알지 못하는 경우 많은 데이터를 그룹화하고 합계하도록 데이터베이스에 요청할 수 있습니까?

+0

명확히하기 위해 유스 케이스는 여러 개의 작업 표 항목이 첨부 된 계약으로, 각각 금액이 있습니다. 계약서에 소비 된 총 금액은 작업 표 항목의 합계로 계산됩니다. –

+0

일반적으로 계약마다 얼마나 많은 작업 표 항목이 있습니까? 항목을 추가 할 때 적용 할 비즈니스 규칙이 있습니까? – tomliversidge

+0

60에서 750 항목까지 다양 할 수 있습니다. 선택한 요금을 확인하는 것이 계약 및 시간/날짜에 유효하다는 것과 같이 적용 할 비즈니스 규칙이 있습니다. –

답변

3

DDD에 따르면 aggregate-root는 지속성을 알 필요가 없지만 전체 aggregate-root가 메모리에서 인스턴스화되는 것을 의미하지는 않습니다.

아뇨, 그렇지 않습니다. 전체 집계 (루트 및 모든 하위 엔터티)이로드되어 메모리에 인스턴스화됩니다. 본질적으로 정의에 따라 변경을 확인하기 위해로드 된 모든 상태가 필요합니다.

예를 들어, aggregate-root는 지속성에 대해 알지 못하는 경우 많은 데이터를 그룹화하고 합계 할 수 있습니까?

이렇게하려면 aggregate-root가 필요하지 않습니다.

도메인 모델의 주된 역할은 모든 기록이 비즈니스 불변성을 존중하도록하여 기록부의 무결성을 보장하는 것입니다. 데이터베이스 보고서와 같은 읽기는 레코드 책을 변경하지 않으므로 도메인 모델을로드 할 필요가 없습니다.

도메인 모델 자체에 보고서가 필요한 경우 일반적으로 필요한 보고서를 지정하는 서비스 공급자 인터페이스가 정의되며, 지속성 구성 요소는 해당 인터페이스를 구현하는 방법을 파악해야합니다.

2

DDD에 따르면 aggregate-root는 지속성을 알 필요가 없지만 전체 aggregate-root가 메모리에서 인스턴스화되는 것을 의미하지는 않습니까?

집계 루트는 일관성 경계입니다. 따라서 일반적으로 불변량을 적용하기 위해 전체 집계를 메모리에로드합니다. 이것이 문제처럼 들리면 아마 집계가 너무 크고 리팩토링이 필요하다는 암시 일 수 있습니다.

예를 들어, aggregate-root는 지속성에 대해 알지 못하는 경우 많은 데이터를 그룹화하고 합계 할 수 있습니까?

집합체는 데이터베이스에 그룹화 및 합계 데이터를 요청하지 않습니다. 일반적으로 응용 프로그램 서비스/명령 처리기에서 집계를로드합니다. 예를 들면 다음과 같습니다.

public class SomeUseCaseHandler : IHandle<SomeCommand> 
{ 
    private readonly ISomeRepository _someRepository; 
    public SomeUseCaseHandler(ISomeRepository someRepository) 
    { 
     _someRepository = someRepository; 
    } 

    public void When(SomeCommand command) 
    { 
     var someAggregaate = _someRepository.Load(command.AggregateId); 
     someAggregate.DoSomething(); 
     _someRepository.Save(someAggregate); 
    } 
} 

그래서 집계가 유지되는 방식은 무시됩니다. 그러나 ISomeRepository의 구현은 이 아니며이 아니므로 집계를 완전히로드하는 데 필요한 모든 작업을 수행 할 수 있습니다. 집계를로드 할 때 그래서 당신은 는 당신의 영속 구현 그룹/합을 가질 수 있지만, 더 자주 당신은 아마 읽기 모델을 조회 할 것이다 :

public class SomeUseCaseHandler : IHandle<SomeCommand> 
{ 
    private readonly ISomeRepository _someRepository; 
    private readonly ISomeReadModel _someReadModel; 

    public SomeUseCaseHandler(ISomeRepository someRepository, ISomeReadModel readModel) 
    { 
     _someRepository = someRepository; 
     _someReadModel = someReadModel; 
    } 

    public void When(SomeCommand command) 
    { 
     var someAggregaate = _someRepository.Load(command.AggregateId); 
     someAggregate.DoSomethingThatRequiresTheReadModel(_someReadModel); 
     _someRepository.Save(someAggregate); 
    } 
} 

당신은 실제로 사용 사례가 있지만 무엇 말했다하지 않았습니다. :)

[업데이트]

그냥 제목이 데이터베이스 생성 된 보고서를 참조주의 -이 그것을 완전히 별도의 읽기 모델이 될 것입니다, 모든 도메인 모델을 통과하지 않습니다. CQRS가 여기에 적용됩니다.