В соответствии с DDD совокупный корень не должен знать о сохранении, но не означает ли это, что весь совокупный корень заканчивается тем, что создается в памяти?
Совокупные корни являются границами согласованности, так что да, вы обычно загружаете весь совокупность в память, чтобы обеспечить соблюдение инвариантов. Если это звучит как проблема, вероятно, это намек на то, что ваш агрегат слишком велик и, возможно, нуждается в рефакторинге.
Как мог, например, заполнить корневой каталог, чтобы база данных группировала и суммировала много данных, если она не должна знать о сохранении?
Агрегат не будет запрашивать базу данных для группировки и суммирования данных - как правило, вы загружаете агрегат в обработчик/службу приложений. Например:
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);
}
}
Вы на самом деле не сказали, что ваш случай использования, хотя. :)
[Update]
Просто заметил, что название относится к генерации отчетов базы данных - это не будет проходить через вашу модель домена вообще, было бы совершенно отдельная модель чтения. CQRS применяется здесь
Чтобы уточнить, прецедент - это контракт, в котором есть несколько записей расписания, каждый с денежной суммой. Общая сумма, потраченная на контракт, рассчитывается путем суммирования сумм записей расписания. –
Сколько записей в расписании обычно будет за каждый контракт? Существуют ли правила ведения бизнеса при добавлении записей? – tomliversidge
Он может варьироваться от 60 до 750 записей. Существуют правила ведения бизнеса, например, проверка выбранной ставки действительна для Контракта и времени/даты. –