DDD: сохранение изменений в модели и доступ к репозиторию - PullRequest
2 голосов
/ 17 апреля 2009

У меня есть объект Question, который является корнем агрегата вопросов. Этот вопрос связан с объектами ответа в его совокупности. Когда создается новый объект ответа, изменения будут сохранены в БД через репозиторий. Могу ли я вызвать метод репозитория SaveAnswer (идентификатор вопроса) или я должен вызвать SaveQuestion (QUestionID) и заставить репозиторий определить, какие изменения были внесены? Если последнее, как это реализовано?

И наоборот, если я хочу загрузить все ответы на конкретный вопрос, я должен вызвать GetQuestion () и затем получить ответы или просто вызвать GetAnswers (questionID).

ТИА

1 Ответ

6 голосов
/ 18 апреля 2009

Во-первых, позвольте мне сказать, что здесь нет жестких и быстрых правил, это мое понимание 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-ориентированный способ приблизиться к вещам, где ответ находится в той же совокупности, что и вопрос, а вопрос - корень совокупности.

Для извлечения объектов из базы данных, как правило, вы запрашиваете в хранилище объект вопроса (предположительно по идентификатору), а затем переходите оттуда к ответу (через коллекцию ответов на вопрос) - например,

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

Если это кажется странным способом сохранения или извлечения объекта Ответа, то вам может потребоваться переоценить, действительно ли Ответ относится к одному и тому же агрегату, или было бы лучше вычеркнуть его из совокупности вопросов вообще .

...