Как смоделировать отношения между двумя совокупными корнями - PullRequest
1 голос
/ 22 февраля 2012

У меня есть один класс с именем Question и другой с именем StudentDriver.StudentDriver есть список вопросов.Поскольку оба класса являются агрегатными корнями, у них есть свой собственный репозиторий.

Когда я собираюсь добавить новый вопрос, должен ли класс StudentDriver иметь метод с именем addQuestion()? И я бы слил объект studentdriver черезрепозиторий StudentDriver, или я бы оставил вопрос с репозиторием вопросов?Если я сохраню его с хранилищем вопросов, то список вопросов, принадлежащих ученику, не будет содержать вновь добавленный вопрос, пока я не обновлю его из базы данных.

Я не понимаю связи между двумя совокупными корневыми объектамии как я собираюсь смоделировать это правильно.

Я использую JPA.

1 Ответ

4 голосов
/ 22 февраля 2012

Похоже, у вас есть два варианта:

1) Два совокупных корня. Добавление нового вопроса будет выглядеть так:

StudentDriver student = studentsRepository.findById(id);
Question question = someFactory.CreateForStudent(student);
questionsRepository.Persist(question);

И получение всех вопросов для студента будет обязанностью хранилища вопросов:

IList<Question> studentQuestions = questionsRepository.findByStudent(student);

По сути, у вас есть постоянные однонаправленные отношения от вопроса к ученику: вопрос "принадлежит человеку" (много-к-одному).

2) Один совокупный корень. StudentDriver является корнем агрегата, который содержит список вопросов. Добавление нового вопроса будет выглядеть так:

StudentDriver student = studentsRepository.findById(id);
student.addNewQuestion("Should you stop on a red light?", "Yes");
studentsRepository.Persist(student);

Чтобы получить все вопросы для студента, вы должны использовать что-то вроде:

IList<Question> studentQuestions = student.GetAllQuestions();

Выбор между двумя вариантами зависит от информации, которая отсутствует в ОП. Хороший способ определить совокупный корень - взглянуть на логику жизненного цикла. Вопросы типа

  • Может ли Вопрос существовать без соответствующего ученика?
  • Может ли Вопрос быть «переназначен» от одного ученика к другому?
  • Когда вы удаляете / архивируете Студента, следует ли удалять все Вопросы?
...