Я изучаю дизайн, управляемый доменами (да, я довольно опаздываю на эту вечеринку), и до сих пор я пришел к осознанию того, что модель домена должна быть центром вселенной. Сохранение данных - это просто практическая деталь.
Однако, если это правда, то мне сложно понять, где должна быть связь с частью настойчивости (например, с репозиторием).
Например, если я хочу быть может добавить новую оценку студенту, следует ли мне вызвать репозиторий из модели предметной области студента, например:
interface IGradeRepository
{
void SaveGrade(int courseId, string grade);
// ...other methods
}
class Student
{
IGradeRepository _gradeRepository;
List<Grade> _grades = new List<Grade>();
public Student(IGradeRepository gradeRepository)
{
_gradeRepository = gradeRepository;
}
int StudentId { get; set; }
void AddGrade(int courseId, string grade)
{
var grade = new Grade(this.StudentId, courseId, grade);
_grades.Add(grade);
// Do I put the call to the data persistance here?
_gradeRepository.SaveGrade(grade);
}
}
Как видите, лучше всего получить доступ к репозиторию изнутри модель предметной области. Однако я не уверен, что это способ go об этом. Кажется, это одна из тех вещей, которые упускаются из виду во многих учебных пособиях.
Итак, подведем итог: откуда я могу получить доступ к уровню данных при проектировании, управляемом доменом?
Обновление
Как отмечают некоторые, из моего примера не ясно, как я могу получить доступ к классу учеников. Я бы, вероятно, сделал это из модели представления или через какую-то службу вариантов использования.
Пример с представлением модели:
class StudentGradesViewModel
{
// (...) all sort of VM-stuff
private Student _student;
private Course _selectedCourse;
public void AddGrade(string grade)
{
_student.AddGrade(_course.CourseId, grade);
}
}