Я понимаю, что агрегированные корни - это единственный объект, который будет загружен клиентом, и все операции для объектов внутри агрегированного корня выполняются агрегатным корнем. По тому же соглашению должен быть один интерфейс репозитория, определенный для агрегированного корня, и любые операции сохранения для любого объекта в агрегированном корне должны выполняться этим «агрегированным корневым репозиторием», соответствующим агрегированному корню. Означает ли это, что только объект агрегированного корня должен передаваться в «репозиторий агрегированного корня» для операций, связанных с подобъектами агрегированного корня?
Приведу пример.
Предположим, у вас есть объект School и объект Student. Поскольку ученик не может существовать без школы (можно сказать, что ученик мог бросить школу, в этом случае он / она больше не учится), поэтому у нас есть
class School
{
string SchoolName;
IList<Student> students;
}
class Student
{
string StudentName;
string Grade;
School mySchool;
}
Школа здесь является совокупным корнем. Теперь предположим, что мы хотим определить репозиторий для операций сохранения.
Что из нижеприведенного будет правильным?
1)
interface ISchoolRepository
{
void AddSchool(School entity);
void AddStudent(School entity); //Create a School entity with only the student(s) to be added to the School as the "students" attribute
}
2)
interface ISchoolRepository
{
void AddSchool(School entity);
void AddStudent(Student entity); //Create a Student entity. The Student entity contains reference of School entity in the "mySchool" attribute.
}
В 1) мы только показываем агрегат в интерфейсе. Таким образом, любой DAL, реализующий ISchoolRepository, должен будет получить объект Student из объекта School для добавления ученика. 2) выглядит более очевидным, и я могу показаться глупым, предлагая 1), но концепция совокупного корня в чистой теории предполагает 1)