domain-driven-design - 如何在DDD上使用继承

标签 domain-driven-design

我目前正在尝试DDD并阅读Evans的书。我已经得出了一个模型,该模型的根是学生。现在,我需要(或能够区分)一个RegisteredStudent和一个EnrolledStudent(继承自RegisteredStudent)。我不知道如何在DDD中处理继承。

  • 2个继承的类是否应该在聚合中?如果是这样,由于它们的身份与根相同(仅向它们添加了属性),它们是否也被视为聚合根?如果没有,我如何允许其他实体访问它们?
  • 还是我不应该使用继承?为什么?
  • 而且,如果聚合中有一个不是根的实体,但需要它在外部继承实体,该怎么办?你应该怎么做?
  • 最佳答案

    您需要问自己的是,RegisteredStudent和EnrolledStudent是否是不同的概念。他们不是两个学生,而是处于不同的状态吗?

    通常,您应该更偏重于继承而不是继承。

    这是我会做的一个例子。 (请注意,这只是我的示例,我不知道域,因此它不是确定的解决方案)。

    您可能有一个Student类,这是您的聚合根,然后是一些不同的状态类:RegisteredEnrolled。这样,您就不必在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/

    相关文章:

    validation - 领域驱动设计 - 实体的访问修饰符和强制验证

    domain-driven-design - 每个属性应该有一个更新事件,还是每个具有事件源的实体都有一个更新事件?

    c# - 具有 MediatR 的 CQRS 和命令的可重用性

    repository - 使用 CQRS 的 DDD 中的通用存储库模式,它有意义吗?

    asp.net-core - 我应该从 DDD 中的存储库返回 IQueryable<T>

    linq-to-sql - ASP.MVC : Repository that reflects IQueryable but not Linq to SQL, DDD 如何提问

    c# - 良好的设计 DDD 和 IoC,如何将 IRepository 注入(inject)模型

    sql - 更新语句与 ASP.NET MVC4 中的 FOREIGN KEY 约束冲突

    architecture - 限界上下文和领域专家的参与

    c# - 使用服务的 DDD 实体