在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);
}
}
}
}
}
你幫我評論過,因爲我意識到我正在做的事情已經存在。所以我改變了方法:我首先使用代碼實體框架;並實行工作單位模式。所以現在EF環境正在爲我保留這些變化。感謝您的反饋! –
@Dmitry +1這是一個非常有效的點。在我的特殊情況下,我不能對所使用的ORM的功能做任何假設(它甚至可能不是ORM),因此我有必要在域中實現諸如更改跟蹤等事情。如果你充分綁定到一個ORM實現,你可以可靠地利用它的功能,那麼當然這樣做很有意義:) – MattDavey
實際上,我的域不依賴於ORM或其他任何東西。這是洋蔥建築的中心。圍繞它構建的工作單元依賴於ORM,並使用其上下文進行更改跟蹤。但該域名只有域邏輯... –