Совокупный корень в контексте шаблона репозитория

Я понимаю, что агрегированные корни - это единственный объект, который будет загружен клиентом, и все операции для объектов внутри агрегированного корня выполняются агрегатным корнем. По тому же соглашению должен быть один интерфейс репозитория, определенный для агрегированного корня, и любые операции сохранения для любого объекта в агрегированном корне должны выполняться этим «агрегированным корневым репозиторием», соответствующим агрегированному корню. Означает ли это, что только объект агрегированного корня должен передаваться в «репозиторий агрегированного корня» для операций, связанных с подобъектами агрегированного корня?

Приведу пример.

Предположим, у вас есть объект 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)


person devanalyst    schedule 12.07.2012    source источник


Ответы (1)


Я нашел здесь аналогичный вопрос как мне добавить объект в коллекцию, поддерживаемую совокупным корнем

Объединяя оба ответа из указанной ссылки, правильным способом было бы

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. 
}

ИЛИ более строго

interface ISchoolRepository  
{     
 void AddSchool(School entity);    
 void AddStudent(string StudentName, string Grade); //without exposing Student type
}
person devanalyst    schedule 13.07.2012
comment
Первый вариант, хотя я бы назвал методы Save и позволил Repo решать, является ли это добавлением или обновлением. - person MikeSW; 16.07.2012