您应该围绕资源而不是角色来构建API,例如:
/rest/students
任何角色允许他们看到学生的人都应该可以访问。
在内部,您正在实现基于角色的安全性。处理方式取决于应用程序的详细信息,但是假设您有一个角色表,每个人都有一个或多个角色,这些角色决定了每个人可以访问什么。您已经说明了访问学生的规则:
- 学生可以在所参加的课程中访问学生
- 老师可以在他们所教的课程中与学生接触
因此,当有人打电话时:
/rest/students
您调用一种方法来访问学生,并传递人的角色。这是一些伪代码:
roles = person.roles; //array
students = getStudents( roles );
return students;
通过这种方法,您可以通过单独的调用来获得每个角色的学生,例如:
factory = getFactory();
classes= [];
students = [];
for( role in roles ){
service = factory.getService( role );
// implementation details of how you get classes for student/teacher are hidden in the service
classes = classes.merge( service.getClasses( person ) );
// classes[] has class.students[]
// loop on classes and add each student to students, or send back classes with nested students? depends on use case
}
}
对于您可以做什么,这是一个很粗糙的想法,不一定能满足您的特定需求,但是它应该使您对所涉及的部分有所了解。如果您想返回列出的每个学生的课程,这是一个很好的方法。如果您只想要学生,则可以从每个班级中提取他们,然后将其合并为学生集合。
不可以,每个角色都不应有单独的存储库。角色所要做的就是确定如何获取数据,以及如何处理数据(例如,老师可以输入学生成绩)。数据本身是相同的。
至于模式,这种方法是使用Factory Pattern提取基于角色的获取数据的服务。按角色拥有单独的服务可能适当,也可能不合适。我喜欢这种方法,因为它可以使程序每个阶段的代码量减至最少,并使它比开关或if块更具可读性。