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

domain-driven-design – 如何在DDD上使用继承,第1张

概述我目前正在尝试DDD并阅读埃文斯的书.我已经到达了一个模型,该模型的根目录是Student.现在我需要(或能够区分)RegisteredStudent和EnrolledStudent(继承RegisteredStudent).我不知道如何在DDD中处理继承. > 2个继承的类应该在聚合内吗?如果是这样,它们是否也被认为是聚合根,因为它们的身份与根相同(只有添加属性)?如果没有,我如何从其他实体访问 我目前正在尝试DDD并阅读埃文斯的书.我已经到达了一个模型,该模型的根目录是Student.现在我需要(或能够区分)RegisteredStudent和EnrolledStudent(继承RegisteredStudent).我不知道如何在DDD中处理继承.

> 2个继承的类应该在聚合内吗?如果是这样,它们是否也被认为是聚合根,因为它们的身份与根相同(只有添加属性)?如果没有,我如何从其他实体访问它们?
>或者我应该不使用继承?为什么?
>而且,如果您的聚合中的实体不是根,但是您需要它来继承外部的实体,该怎么办?你应该怎么做呢?

解决方法 您在这里需要问自己的是RegisterStudent和EnrolledStudent是不同的概念.他们不是学生,而是处于不同的状态吗?

一般来说,你应该赞成合成而不是继承.

这是我要做的一个例子. (请注意,这只是我的例子,我不知道域名,所以它不是一个明确的解决方案).

您可以拥有一个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编辑器,因此可能存在语法错误)

评论后编辑:

是否需要公开State-property取决于上下文.一般来说,我建议不要这样做,因为你暴露了学生的内部.例如,公开一个名为CanEnroll的方法会更好.这样,您可以更改状态模式的内部实现,而不会影响任何客户端.

至于问题3,没有用例就很难说.但是,这里有一些指导方针:

>赞成作品而不是继承(再次,我知道)>你可以从聚合内部到外部世界的引用,但你不应该有相反的参考.

总结

以上是内存溢出为你收集整理的domain-driven-design – 如何在DDD上使用继承全部内容,希望文章能够帮你解决domain-driven-design – 如何在DDD上使用继承所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1133119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存