DDD并避免CRUD

g_b*_*g_b 6 domain-driven-design

在我读到的大多数文章中,似乎在DDD中要避免使用CRUD,因为我们正在处理建模业务流程而不是数据.但是,我发现很难看到不对某些实体进行CRUD操作.例如,在学校评分系统中,在教师对学生进行评分之前,必须存在SchoolYear或者可能是GradingPeriod.我看不出如何在没有CRUD的情况下管理GradingPeriods.有人可以启发我这个吗?

Ken*_*eth 12

DDD的一个非常重要的部分是有限的背景.

有界上下文是术语一致的应用程序的分隔部分.DDD很少是整个应用程序的正确方法.因此,我们通常将应用程序划分为单独的有界上下文.在每个有界上下文中,您可以使用不同的模式.对于具有非常小的域复杂度的BC和针对具有高复杂度的区域的DDD说CRUD.

每个人都不应该避免使用CRUD.当存在复杂的业务规则时,应避免使用CRUD.当您使用非常少的规则为数据提供表单时,应避免使用DDD.

因此,可以使用一些应用程序,其中一些部分执行简单的CRUD,而其他部分使用更丰富的域模型.

这是等式的一部分,回到你原来的问题:

"在教师对学生进行评分之前,必须有一个SchoolYear,或者可能是一个GradingPeriod"

你在这里暗示创建一个schoolyear是一个CRUD操作,你可能已经在思考了"INSERT INTO schoolyears ...".这是一种可能性(你可以使用有界上下文这样做,见上文).如果没有很多域逻辑,那么使用CRUD就可以了.

但是,你需要确定"插入一个新的schoolyear"实际上是不是"打开一个schoolyear"的技术术语.DDD强调语言.如果您确定打开一个新的schoolyear附加了许多规则并且需要复杂的代码,您应该将它放在您的域中.因此,如果您的域专家不断告诉您他们如何"开设一个新的学校",那么您应该在您的域中对该行为进行建模.因此,不应将其称为"InsertNewSchoolYear",而应将您的方法称为"OpenNewSchoolYear".最终是否在数据库中插入是无关紧要的,您希望捕获模型中的特定领域知识.

  • @Kenneth,除了您不应该使用相同的数据库集成 BC。他们应该通过某种 API 或域事件/消息进行通信。 (3认同)
  • 我不建议这样做。在单个 BC 内,您应该尽可能保持语言简洁。如果您在同一个 BC 内有“InsertSchoolYear”和“GradeExam”,则可能会感到困惑。但是,没有什么可以阻止您在一个 BC (CRUD) 中拥有 `InsertSchoolYear` 并在另一个 BC 中拥有 `SchoolYear` 的域概念,即使它们连接到相同的数据(数据库表或视图或...),无论您的内容是什么域应该与数据存储无关。 (2认同)