У меня есть доменная модель с агрегированным корнем:
public interface IAggregateRoot {
public string Id { get; }
public string Foo { get; set; }
public int Bar { get; set; }
public IList<IChildEntity> Children { get; }
}
Коллекция Children имеет тенденцию становиться очень большой, и я буду лениво загружать ее, когда экземпляр IAggregateRoot будет получен через IAggregateRootRepository. Моя проблема заключается в следующем: если я хочу добавить IChildEntity в коллекцию Children корня IAggregateRoot, как мой репозиторий может позволить мне избежать персистирования всего агрегата?
Например, допустим, мой IAggregateRootRepository будет выглядеть следующим образом:
public interface IAggregateRootRepository {
public IAggregateRoot GetById(string id);
public void AddOrUpdate(IAggregateRoot root);
}
Тогда я мог бы добавлять в коллекцию Children, получая экземпляр IAggregateRoot через IAggregateRootRepository.GetById(), добавляя ребенка в коллекцию Children, а затем сохраняя все это через IAggregateRootRepository.AddOrUpdate(). Однако это приведет к сохранению всего корня агрегата вместе с его огромной коллекцией дочерних элементов каждый раз, когда я добавляю дочерний элемент. Думаю, я мог бы обойти это, если бы мое хранилище выглядело так:
public interface IAggregateRootRepository {
public IAggregateRoot GetById(string id);
public void AddOrUpdate(IAggregateRoot root);
public void AddOrUpdate(IChildEntity child);
}
Но, как я понял паттерн хранилища, хранилище должно иметь дело только с агрегированными корнями, и приведенное выше решение, конечно, нарушает это требование.
Есть ли другие, лучшие способы избежать этой проблемы?