我目前正在尝试DDD并阅读Evans的书。我已经得出了一个模型,该模型的根是学生。现在,我需要(或能够区分)一个RegisteredStudent和一个EnrolledStudent(继承自RegisteredStudent)。我不知道如何在DDD中处理继承。
最佳答案
您需要问自己的是,RegisteredStudent和EnrolledStudent是否是不同的概念。他们不是两个学生,而是处于不同的状态吗?
通常,您应该更偏重于继承而不是继承。
这是我会做的一个例子。 (请注意,这只是我的示例,我不知道域,因此它不是确定的解决方案)。
您可能有一个Student类,这是您的聚合根,然后是一些不同的状态类:Registered
和Enrolled
。这样,您就不必在Student上公开这些状态类,而只需在Student上公开方法。一个小例子(在C#中):
class Student
{
State _currentState;
void Enroll()
{
if(!_currentState is Registered)
throw new InvalidOperationException("Cannot enroll student who is not registered");
this._currentState = new Enrolled();
}
void Register(string name)
{
this._currentState = new Registered(name);
}
}
class StudentState{}
class Enrolled : StudentState
{}
class Registered : StudentState
{
public Registered(string name)
{
Name = name;
}
public string Name {get; private set;}
}
这是State-design模式的一个简单应用,您可以将它的更多部分外部化并构建完整的状态机,但我将留给您自己。 (而且它直接输入到SO编辑器中,因此可能存在语法错误)
评论后编辑:
是否需要公开状态属性取决于上下文。通常,我建议不要这样做,因为您要公开学生的内部情况。例如,最好公开一个名为
CanEnroll
的方法。这样,您可以更改状态模式的内部实现,而不会影响任何客户端。至于问题3,没有用例就很难说。但是,以下是一些准则:
关于domain-driven-design - 如何在DDD上使用继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23969182/