2009-04-17 2 views
2

J'ai un objet Question qui est la racine de l'agrégat de questions. La question a associé les entités de réponse dans leur ensemble. Lorsqu'un nouvel objet Answer est créé, les modifications seront enregistrées dans la base de données via le référentiel. Puis-je appeler une méthode de référentiel SaveAnswer (ID de question) ou dois-je appeler une méthode SaveQuestion (QUestionID) et demander au référentiel de déterminer les modifications apportées? Si ce dernier, comment est-ce mis en œuvre?DDD: Enregistrement des modifications apportées au modèle et accès au référentiel

Inversement, si je veux charger toutes les réponses à une question particulière, dois-je appeler GetQuestion() et ensuite tirer les réponses, ou puis-je simplement appeler GetAnswers (questionID).

tia

Répondre

6

Tout d'abord, permettez-moi de dire qu'il n'y a pas de règles dures et rapides ici, ceci est ma compréhension de DDD et l'accès au référentiel, mais il est une zone assez subjective ...

Ainsi, à partir d'un DDD perspective ce que vous pouvez faire lors de l'ajout d'une réponse à une question existante est quelque chose comme C# de style pseudo-code:

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

en supposant que vous utilisez un ORM qui gère le suivi des modifications et qui est configuré en cascade objets enfants Retour à la base de données qui est tout ce que vous auriez besoin de faire (je pense à NHibernate ici, mais d'autres ORM peuvent fonctionner de la même manière). En ajoutant la réponse à la question, vous avez indiqué à l'ORM que vous souhaitez que la réponse soit conservée dans la base de données lorsque l'unité de travail est terminée. Vous n'appelez généralement pas SaveAnswer (QuestionId) - ce n'est pas une façon très centrée sur DDD d'aborder les choses où Answer est dans le même agrégat que Question et Question est la racine agrégée. Pour obtenir les objets hors de la base de données, vous demanderiez généralement au référentiel un objet de question (par ID probablement), puis naviguez jusqu'à la réponse à partir de là (via une collection Réponses sur la question) - par ex.

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

Si cela semble une étrange façon de sauvegarder ou récupérer l'objet de réponse, alors vous voudrez peut-être réévaluer si réponse ne lui appartient en fait dans le même agrégat, ou s'il serait préférable de le casser sur la question agrégée tout à fait.

+0

c'est la réponse que j'espérais ne pas obtenir :) merci – zsharp

Questions connexes