В DDD часто бывает, что вы берете всю иерархию композиции из корня агрегата и рассматриваете ее как единый объект.Итак, приняв этот менталитет, «зачем мне сохранять статью, если был добавлен только комментарий?» , может показаться, что статья в целом изменилась, и представление статьи в базе данныхнесвежий.В идеале вы должны заменить всю композиционную иерархию в базе данных (с базой данных документов, это было бы хорошо), однако это может привести к проблемам с производительностью в реляционной БД.
В этом случае вы можете решить иметь хранилищепросмотрите состав объекта, соберите корень вниз и разумно решите, что делать с каждым компонентом.Вы можете использовать шаблон посетителя для итерации по объектам Comment, и в зависимости от того, являются ли они временными или грязными, решают сделать вставку или обновление, или просто оставить их в покое ..
Я надеюсь, что яЯ достаточно ясно объяснил концептуальные вещи:)
РЕДАКТИРОВАТЬ: Пример кода:
// In ArticleRepository...
public void Save(Article article)
{
// IsTransient (as opposed to IsPersistant) means "has not yet been saved"...
if (article.IsTransient)
{
DB.InsertArticle(article);
// Inserting the article also inserts any comments / sub components...
}
else
{
// IsDirty means "has been modified since it was taken from the DB"...
if (article.IsDirty)
{
DB.UpdateArticle(article);
}
foreach(var comment in article.Comments)
{
if(comment.IsTransient)
{
DB.InsertComment(article.Id, comment);
}
else
{
if (comment.IsDirty)
{
DB.UpdateComment(comment);
}
}
}
}
}