在我读过的大多数文章中,似乎要避免在DDD中使用CRUD,因为我们正在处理建模业务流程而不是数据。但是,我发现很难看到不对某些实体进行CRUD操作。例如,在学校评分系统中,在教师对学生进行评分之前,必须存在SchoolYear或者可能是GradingPeriod。我无法看到如何在没有CRUD的情况下管理GradingPeriods。有人可以启发我吗?
答案 0 :(得分:9)
DDD的一个非常重要的部分是有限的背景。
有界上下文是术语一致的应用程序的分隔部分。 DDD很少是整个应用程序的正确方法。因此,我们通常将应用程序划分为单独的有界上下文。在每个有界上下文中,您可以使用不同的模式。对于具有非常小的域复杂度的BC和对于具有高复杂度的区域的DDD,请说CRUD。
每个人都不应该避免使用CRUD。当存在复杂的业务规则时,应避免使用CRUD。当您使用非常少的规则为数据提供表单时,应避免使用DDD。
因此,有一个应用程序可以使用一些部分执行简单的CRUD,而其他部分可以使用更丰富的域模型。
这是等式的一部分,回到原来的问题:
“在教师对学生进行评分之前,SchoolYear必须在场或者可能是GradingPeriod”
你在这里暗示创建一个schoolyear是一个CRUD操作,你可能已经在考虑"INSERT INTO schoolyears ..."
了。这是一种可能性(你可以使用有界上下文这样做,见上文)。
如果没有很多域逻辑,那么使用CRUD就可以了。
但是,你需要确定“插入一个新的schoolyear”实际上是不是“打开一个schoolyear”的技术术语。 DDD强调语言。如果您确定打开一个新的schoolyear附加了许多规则并且需要复杂的代码,您应该将它放在您的域中。因此,如果您的域名专家不断告诉您他们如何“开设一个新的学校”,那么您应该在您的域中对该行为进行建模。因此,不应将其称为“InsertNewSchoolYear”,而应将您的方法称为“OpenNewSchoolYear”。最终是否在数据库中插入是无关紧要的,您希望在模型中捕获特定的域知识。