【发布时间】:2020-09-15 04:16:33
【问题描述】:
假设我有一个 StudentService 的方法可以向学生添加课程,LessonService 的方法可以将学生添加到课程中。在我的课程和学生解析器中,我希望能够更新本课 学生关系。所以在我的LessonResolver 中,我有一些类似的东西:
async assignStudentsToLesson(
@Args('assignStudentsToLessonInput')
assignStudentsToLesson: AssignStudentsToLessonInput,
) {
const { lessonId, studentIds } = assignStudentsToLesson;
await this.studentService.assignLessonToStudents(lessonId, studentIds); **** A.1 ****
return this.lessonService.assignStudentsToLesson(lessonId, studentIds); **** A.2 ****
}
在我的StudentResolver中基本上是相反的
上面A.1和A.2的区别在于StudentService可以访问StudentRepository而LessonService可以访问LessonRepository - 我相信它坚持关注点的可靠分离。
但是,StudentModule 必须导入 LessonModule 而LessonModule 必须导入 StudentModule 似乎是一种反模式。这可以使用forwardRef 方法解决,但在NestJS Documentation 中提到如果可能的话应该避免这种模式:
虽然应尽可能避免循环依赖,但您 不能总是这样做。 (这是其中一种情况吗?)
这似乎应该是使用 DI 时的常见问题,但我正在努力获得一个明确的答案,以确定哪些选项可以消除这种情况,或者我是否偶然发现了一种不可避免的情况.
我的最终目标是能够编写下面的两个 GraphQL 查询:
query {
students {
firstName
lessons {
name
}
}
}
query {
lessons {
name
students {
firstName
}
}
}
【问题讨论】:
标签: typescript design-patterns dependency-injection graphql nestjs