在存储库模式的上下文中聚合根

时间:2012-07-12 07:50:20

标签: repository repository-pattern aggregateroot

据我所知,Aggregate Roots是客户端将加载的唯一对象,聚合根目录中对象的所有操作都由Aggregate Root完成。根据相同的约定,应该为聚合根定义一个存储库接口,并且聚合根中的任何对象的任何持久性操作都应该由与聚合根对应的“聚合根存储库”完成。这是否意味着对于与聚合根的子对象相关的操作,只应将Aggregate Root对象传递给“聚合根存储库”?

让我举个例子。

假设您有一个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)我们只在界面中公开聚合。因此,任何实现ISchoolRepository的DAL都必须从School对象获取Student对象以添加学生。 2)看起来更明显,我可能通过建议1)看起来很愚蠢但是纯粹理论中聚合根的概念会暗示1)

1 个答案:

答案 0 :(得分:2)

我在how should i add an object into a collection maintained by aggregate root

找到了类似的问题

合并上述链接的答案,正确的方法是

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
}