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

Domain driven design 何时使用域驱动开发和数据库驱动开发?,domain-driven-design,Domain Driven Design,什么时候应该使用数据库驱动的开发,什么时候应该使用域驱动的开发,谁能给出好的答案呢。这两种发展方法在各自受人尊重的领域都有其重要性。但我不太清楚哪种方法适合哪种情况。有什么建议吗?首先,马丁·福勒在他的《企业架构模式》一书中描述了三种不同的“模式”。事务脚本、活动记录和域模型。DDD使用域模型模式作为总体架构,并描述了许多实现和设计该模型的实践和模式 事务脚本是一种没有任何分层的体系结构。同一段代码读取/写入数据库、处理数据和处理用户界面 活动记录比这更进一步。分离UI后,业务逻辑和数据层仍然在

什么时候应该使用数据库驱动的开发,什么时候应该使用域驱动的开发,谁能给出好的答案呢。这两种发展方法在各自受人尊重的领域都有其重要性。但我不太清楚哪种方法适合哪种情况。有什么建议吗?

首先,马丁·福勒在他的《企业架构模式》一书中描述了三种不同的“模式”。事务脚本、活动记录和域模型。DDD使用域模型模式作为总体架构,并描述了许多实现和设计该模型的实践和模式

事务脚本是一种没有任何分层的体系结构。同一段代码读取/写入数据库、处理数据和处理用户界面

活动记录比这更进一步。分离UI后,业务逻辑和数据层仍然在以数据库为模型的活动记录对象中共存

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

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


大量工具使数据驱动的解决方案变得更容易。在微软的空间里,可视化设计网站是非常容易的,所有的代码都在网页的后面。这是一个典型的事务脚本解决方案,非常适合轻松创建简单的应用程序。RubyonRails提供了一些工具,使使用活动记录对象更容易。当您需要开发更简单的解决方案时,这可能是使用数据驱动的原因。对于行为比数据更重要,并且很难预先定义所有行为的应用程序,DDD是一种解决方法。

我问了一个类似的问题:

从我得到的答案中,我会说:除非您有具体的理由使用数据库驱动的开发,否则请使用域驱动的开发

这样想吧

问题域永远存在。您的类定义将反映域的永恒特性

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


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

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

作为mendelt文章的旁注,我觉得有第四种模式:分层模式,将业务逻辑与持久性和存储分离,但不使用“实体”或“业务对象”。如果愿意,在事务/操作脚本和DDD之间有一个中间点

在我工作过的许多系统中,持久层(存储库)直接使用SqlClient并将数据集返回给调用服务。这些服务执行决策和编译视图,并通过控制器发送给用户。你认为服务层是一种商业模式,你是对的,但它并不是DDD意义上的“域”模型。尽管如此,所有的业务逻辑都发生在这一层中。每一层都有自己的工作。视图显示数据,控制器确定视图,持久化层处理存储,以及在控制器和持久化之间工作的服务

关键是:DDD是一种通过Ul、测试和代码定义业务的方法。它与实体、值对象和聚合无关。这些只是OOP纯粹主义者对DDD方法的副产品


更多想法供您考虑。

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


在我看来,这个实现为您提供了ActiveRecord的易用性和DDD的业务逻辑封装

是的,一些专家也表达了类似的观点。对于像我这样的初学者,我希望使用数据驱动的方法,因为使用大量可用的工具比较容易。域驱动可能适用于有经验开发人员的大型应用程序。同意!,虽然这是上厕所的原因之一