Как избежать персистирования всего агрегатного корня при добавлении дочерней сущности?

У меня есть доменная модель с агрегированным корнем:

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);
}

Но, как я понял паттерн хранилища, хранилище должно иметь дело только с агрегированными корнями, и приведенное выше решение, конечно, нарушает это требование.

Есть ли другие, лучшие способы избежать этой проблемы?

5
задан David Nordvall 16 December 2011 в 10:38
поделиться