2009-04-17 70 views
2

我有一個Question對象,它是問題聚合的根。該問題與其總體中的應答實體相關聯。當創建新的Answer對象時,更改將通過存儲庫保存到數據庫。我可以調用存儲庫方法SaveAnswer(問題ID)還是必須調用SaveQuestion(QUestionID)並讓存儲庫確定進行了哪些更改?如果是後者,這是如何實施的?相反,如果我想加載特定問題的所有答案,我必須調用GetQuestion(),然後拉出答案,或者我可以簡單地調用GetAnswers(questionID)。DDD:保存對模型的更改並訪問存儲庫

TIA

回答

6

首先,讓我說這裏沒有硬性規定,這是我的DDD和存儲庫訪問的理解,但它是一個非常主觀的領域...

所以,從DDD的角度,你可能需要增加一個答案,以現有的問題時,做的是類似下面的C#風格的僞代碼:

using(unitOfWork = new UnitOfWork()) 
{ 
    var question = _questionRepository.GetQuestion(questionId); 
    question.AddAnswer(new Answer("blah")); 
    unitOfWork.SaveChanges(); 
} 

假設你正在使用手柄來更改跟蹤的ORM和配置級聯子對象回到了數據庫是你需要做的(我在這裏想到NHibernate,但其他ORM可以以類似的方式工作)。通過在問題中添加答案,您已告知ORM您希望答案在工作單元完成時保留在數據庫中。您通常不會調用SaveAnswer(QuestionId) - 這不是一種非常以DDD爲中心的方式來處理Answer與Question相同的聚合,Question是聚合根。通常你可以向倉庫詢問一個問題對象(大概是由id),然後從那裏導航到Answer(通過Question上的Answers集合) - 例如,

var question = _questionRepository.GetQuestion(questionId); 
foreach(var answer in question.Answers) 
{ 
    Console.WriteLine(answer.Description); // or do something useful instead! 
}  

如果這似乎是一個奇怪的方式保存或檢索應答對象,那麼你可能要重新評估是否應答並在同一集合實際上屬於,或是否會更好,打破它的這個問題總計在一起。

+0

這就是我希望不會得到的答案:)謝謝 – zsharp 2009-04-18 00:37:05