Новичок в DDD У меня есть простой случай, который я хотел бы смоделировать с использованием подхода DDD
2 объекта Student
и Course
Соответствующим имуществом для студента являются StudentId и Budget
Соответствующими свойствами для Course являются CourseId и Price
Студент и курс - это сущности, которые могут существовать самостоятельно и иметь свой жизненный цикл
Бизнес-требования:
1) Студент может забронировать один курс (CourseId - это fk для таблицы Student)
2) Студент может забронировать курс, только если бюджет пользователя выше или равен цене курса.
3) Изменения цены курса не влияют на студентов, уже забронировавших курс.
4) Когда студент записывается на курс, его бюджет остается неизменным (возможно, изменится позже в конце курса)
5) Бюджет студента можно изменить, установив другую сумму, но новая сумма должна быть больше или равна цене курса, который заказал пользователь.
Установка меньшего значения должна вызвать ошибку времени выполнения.
Каким образом можно смоделировать этот простой случай, следуя доменному дизайну? Где применять правила двух бизнесов (пункты 2 и 5)?
Поскольку Курс может существовать без Студента, я не могу определить совокупность, где Студент является корневым объектом, а Курс его дочерним объектом. Можно я?
Но в то же время бизнес-правило, определенное в пункте 5, кажется мне инвариантом. Это так?
Так где и как применять эти правила?
Я попробовал сервисный подход, может работать для первого простого правила (пункт 2), но не работает для правила, описанного в пункте 5
var student = studentRepository.Get(srtudentId);
var course = courseRepository.Get(courseId)
var studentService = new StudentService();
studentService.SubScribeStudentToCourse(student, course);
studentRepository.Update(student);
StudentService.ChangeStudentBudget(student, 100000);
studentRepository.Update(student);
когда я обновляю студента новым бюджетом, кто-то другой может изменить цену курса, делая бюджет студента непоследовательным
public class StudentService
{
SubScribeStudentToCourse(Studen student, Course course)
{
if (studentt.Budget >= course.Price)
{
student.CourseId = course.CourseId
}
}
ChangeStudentBudget( Student student, decimal budgetAmount)
{
if (student.CourseId != null)
{
var studentCourse = courseRepository.Get(student.CourseId);
if ( studentCourse.Price <= budgetAmount)
{
student.Budget = budgetAmount;
}
else
{
throw new Exception("Budget should be higher than studentCourse.Price");
}
}
}
}