【发布时间】:2018-05-21 19:01:43
【问题描述】:
我是 DDD 的新手,所以我正在做一些练习以了解更多。我的课程 BC 具有以下规则:
- 必须先创建课程,然后他们才能创建一门课程的模块
- 每个模块都由用户上传作业完成
- 当用户完成所有模块后,课程将由用户完成
定义: 课程涵盖特定主题,由模块组成。例如,sap课程有10个模块,例如:模块1:它是什么?,模块2:如何使用它?...
在这之后,我意识到课程是模块的聚合根,因为模块已经完成我必须关闭用户的状态与课程。
模型将是:
public class Course : AggregateRoot
{
private string title;
private List<Module> modules;
}
但模块也是作业的聚合根,因为当用户上传他的作业时,模块必须关闭。这让我认为这种方法是错误的,因为在 DDD 中不可能嵌套聚合根。有人知道这是怎么回事吗?
[更新]
好的,现在我了解了工作的原理以及为什么将其拆分为公元前 2 年。然而我做了一些改变,我想到了一些问题。
-我将注册方法创建为静态,并将构造函数设置为私有。
-Course 必须是一个数组,因为一个学生可以有多个。
-我放了更多与课程和老师相关的参数。当然是老师和实体吧?
-我创建状态当然是在模块完成时更新它,这样我不必阅读所有模块就可以知道它。好吗?
-如何为每个模块传递更多信息,例如标题和描述?课程实体是如何创建所有模块的,对吗?
public class StudentEnrolment: AggregateRoot
{
private StudentId studentId;
private Course courses;
private constructor(
StudentId studentId,
Course course,
){
this.studentId= studentId;
this.courses[] = course;
}
public statuc function enroll(
StudentId studentId,
CourseId courseId,
string courseTitle,
string courseLink,
string teacherId,
string teacherName,
List<Tuple<ModuleId, string>> modules) {
teacher = new Teacher(...);
courseStatus = new courseStatus();
new course(courseTitle, courseLink, courseStatus, teacher);
return new self(studentId, course);
}
public function void uploadModuleHomework(ModuleId moduleId, Homework homework){
/* forward to course.uploadModuleHomework */
}
public boolean isCourseFinished(){
/* forward to course.isFinished */
}
public List<Tuple<ModuleId, string>> getModules(){
/* forward to course.getModules */
}
}
【问题讨论】:
-
你不能有嵌套的 AR,但你可以在 AR 中嵌套实体。
-
好的,你的意思是这个模块是一个实体,它有另一个实体叫做作业。但是您如何看待这种方法?你会以不同的方式做吗?
-
我会问业务专家什么是一致性要求。
-
好吧,我已经解释过了。上面的文字有3条规则。
-
向课程添加新模块时会发生什么?
标签: domain-driven-design aggregateroot