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가 여기에 적용됩니다.
명확히하기 위해 유스 케이스는 여러 개의 작업 표 항목이 첨부 된 계약으로, 각각 금액이 있습니다. 계약서에 소비 된 총 금액은 작업 표 항목의 합계로 계산됩니다. –
일반적으로 계약마다 얼마나 많은 작업 표 항목이 있습니까? 항목을 추가 할 때 적용 할 비즈니스 규칙이 있습니까? – tomliversidge
60에서 750 항목까지 다양 할 수 있습니다. 선택한 요금을 확인하는 것이 계약 및 시간/날짜에 유효하다는 것과 같이 적용 할 비즈니스 규칙이 있습니다. –