何时使用域驱动开发和数据库驱动开发?

时间:2008-11-21 11:48:12

标签: domain-driven-design

当应该使用数据库驱动的开发以及何时应该使用域驱动开发时,任何人都可以得到很好的答案。这两种发展方法都在其受尊重的领域中具有重要意义。但我不清楚哪种方法适合哪种情况。有什么建议吗?

6 个答案:

答案 0 :(得分:43)

首先,对于某些背景,Martin Fowler在他的“企业架构模式”一书中实际描述了三种不同的“模式”。事务脚本,活动记录和域模型。 DDD将域模型模式用于整体架构,并描述了许多实现和设计此模型的实践和模式。

事务脚本是一种没有任何分层的架构。同一段代码读/写数据库,处理数据并处理用户界面。

Active Record是一步之遥。您拆分了UI,业务逻辑和数据层仍然存在于数据库之后的活动记录对象中。

域模型将模型中的业务逻辑与数据层分离。该模型对数据库一无所知。

现在我们来到有趣的部分:
增加分离的成本当然是额外的工作。好处是更好的可维护性和灵活性 当您很少或没有业务规则时,事务脚本很好,您只想进行数据输入并且没有验证步骤或者所有验证都在数据库中实现。
活动记录为此增加了一些灵活性。因为您可以解耦UI,例如在应用程序之间重用它下面的层,您可以轻松地向业务对象添加一些业务规则和验证逻辑。但由于这些仍与数据库紧密耦合,数据模型中的变化可能非常昂贵 当您想要将业务逻辑与数据库分离时,可以使用域模型。这使您可以更轻松地处理变更的需求。域驱动设计是一种最佳地利用这种增加的灵活性来实现复杂解决方案而不依赖于数据库实现的方法。

许多工具使数据驱动的解决方案更容易。在微软空间中,很容易在视觉上设计所有代码都位于网页后面的网站。这是一个典型的事务脚本解决方案,这对于轻松创建简单的应用程序非常有用。 Ruby on rails提供了一些工具,可以更轻松地处理活动记录对象。当您需要开发更简单的解决方案时,这可能是数据驱动的原因。对于行为比数据更重要的应用程序而言,很难在前面定义所有行为DDD是最佳选择。

答案 1 :(得分:7)

我问了一个类似的问题:Where do I start designing when using O/R mapping? Objects or database tables?

从我得到的答案我会说:除非你有充分的理由使用数据库驱动的开发,否则使用域驱动开发。

答案 2 :(得分:7)

这样想。

问题域永远存在。您的课程定义将反映该领域的永恒特征。

关系数据库是当今首选的持久性机制。在某些时候,我们将超越这个“更新”,“更好”,“不同”的东西。数据库设计只是一个实现;它反映了解决方案架构而不是问题域。

因此,它首先是域名。类反映了问题领域和普遍真理。关系数据库和ORM分别排在第二和第三位。最后,填写模型周围的其他内容。

答案 3 :(得分:2)

作为对mendelt帖子的旁注,我觉得有第四种模式:一种是分层的,将业务逻辑与持久性和存储分开,但不使用“实体”或“业务对象”。如果你愿意的话,在Transaction / Action脚本和DDD之间。

在我参与的大量系统中,持久层(存储库)直接使用SqlClient并将数据集返回给调用服务。服务执行通过控制器发送给用户的决策和编译视图。你认为服务层是业务模型,你是对的,但它不是DDD意义上的“域”模型。但是,所有业务逻辑都出现在那一层,一段时间内。每一层都有它的工作。视图显示数据,控制器确定视图,持久层处理存储,以及控制器和持久性之间的服务。

重点是:DDD是一种通过UI,测试和代码定义业务的方法。它不是关于实体,价值对象和聚合。这些东西只是OOP纯粹主义者对DDD方法的副产品。

更多想法供你考虑。

答案 4 :(得分:1)

对于复杂的商业模式,我更喜欢混合使用ActiveRecord和DDD。域对象知道如何保存自己,并且数据操作是针对存储库完成的(如果将存储库视为将数据作为集合公开给模型的东西,则nHibernate可以充当通用存储库)。业务逻辑驻留在域实体中,甚至可以实现对值类型的一些封装,尽管只有在有业务需求时才能实现。 DDD的某些实现有利于删除所有公共setter并仅通过方法修改实体。除非有非常好的业务需求,否则我不喜欢这种实现。

在我看来,这个实现使您可以轻松使用ActiveRecord和DDD的业务逻辑封装。

答案 5 :(得分:0)

领域驱动开发肯定是要走的路。它更有意义,增加了灵活性。