как мне добавить объект в коллекцию, поддерживаемую агрегатным корнем - PullRequest
11 голосов
/ 19 февраля 2009

Допустим, у меня есть агрегатный корень BlogPost. он содержит список <Comment>.
как должна выглядеть подпись BlogPost AddComment? можно ли использовать:

public void AddComment(Comment comment)
{
    Comments.Add(comment);
}

или я должен избегать создания ссылок на дочерних элементов root вне этого и делать что-то вроде этого:

public void AddComment(string text, string email)
{
    Comment comment = new Comment(text, email);
    Comments.Add(comment);
}

Ответы [ 2 ]

6 голосов
/ 19 февраля 2009

Если вы считаете, что Comment является агрегатом BlogPost и не имеет смысла выходить из этой области, тогда вам следует использовать второй пример.

Агрегированный корень должен контролировать, как создаются агрегаты, чтобы их конструкторы не были видны за пределами агрегатного корня.

Плюс, комментарий должен быть дочерним классом BlogPost, если вы хотите истинное отношение AggregateRoot-Aggregate.

6 голосов
/ 19 февраля 2009

Если вы верите в DDD, прекрасно знать о какой-либо сущности под корнем агрегата, если вы не храните идентификатор или ссылку на него где-то за пределами агрегата.

Я бы пошел на blogPost.AddComment(new Comment(...)) -версию.

...