Domain driven design 域驱动设计中业务规则与实体的分离

Domain driven design 域驱动设计中业务规则与实体的分离,domain-driven-design,software-design,cqrs,Domain Driven Design,Software Design,Cqrs,当我在我的软件项目中实践DDD时,我总是面临这样一个问题:“为什么我要在实体中实现我的业务规则?它们不应该是纯数据模型吗?” 注意,根据我对DDD的理解,域模型可以由持久模型和值对象组成 我提出了一个解决方案,将持久模型与域模型分离。另一方面,我们有数据传输对象(DTO),所以我们有3层数据映射。数据库到持久性模型,持久性模型到域模型,域模型到DTO。在我看来,我的解决办法不是一个有效的办法,因为必须付出太多的努力 因此,有没有更好的实践来实现这一目标 我为什么要在实体中实施我的业务规则?它们不

当我在我的软件项目中实践DDD时,我总是面临这样一个问题:“为什么我要在实体中实现我的业务规则?它们不应该是纯数据模型吗?”

注意,根据我对DDD的理解,域模型可以由持久模型和值对象组成

我提出了一个解决方案,将持久模型与域模型分离。另一方面,我们有数据传输对象(DTO),所以我们有3层数据映射。数据库到持久性模型,持久性模型到域模型,域模型到DTO。在我看来,我的解决办法不是一个有效的办法,因为必须付出太多的努力

因此,有没有更好的实践来实现这一目标

我为什么要在实体中实施我的业务规则?它们不应该是纯数据模型吗

持久性实体应该是纯数据模型。您的域实体描述行为。他们不是一回事;这是一种常见的模式,在存储库中使用一点逻辑来将一个更改为另一个

我所知道的管理事物的最干净的方法是将持久性实体视为域实体管理的值对象,并使用类似于a的方法在域和持久性之间进行转换

另一方面,我们有数据传输对象(DTO),所以我们有3层数据映射。数据库到持久性模型,持久性模型到域模型,域模型到DTO。在我看来,我的解决办法不是一个有效的办法,因为必须付出太多的努力

这里提供了一些简化,基于这样一种想法,即如果要实现查询,实际上不需要“域模型”,因为实际上不需要更改支持数据。在这种情况下,您可以将“域模型”从循环中完全去掉

我为什么要在实体中实施我的业务规则?它们不应该是纯数据模型吗

持久性实体应该是纯数据模型。您的域实体描述行为。他们不是一回事;这是一种常见的模式,在存储库中使用一点逻辑来将一个更改为另一个

我所知道的管理事物的最干净的方法是将持久性实体视为域实体管理的值对象,并使用类似于a的方法在域和持久性之间进行转换

另一方面,我们有数据传输对象(DTO),所以我们有3层数据映射。数据库到持久性模型,持久性模型到域模型,域模型到DTO。在我看来,我的解决办法不是一个有效的办法,因为必须付出太多的努力


这里提供了一些简化,基于这样一种想法,即如果要实现查询,实际上不需要“域模型”,因为实际上不需要更改支持数据。在这种情况下,您可以将“域模型”从循环中完全去掉。

DDD和数据是完全不同的东西。聚合的数据(结果)将以某种方式持久化,具体取决于您使用的内容。就我个人而言,我认为域内事件的结果是DTO(从技术上讲是),它可以直接存储在事件存储中(如果使用事件源),或者作为持久性模型的数据源

域模型表示相关的域行为,域状态为“结果”。实体是具有id的概念,而值对象仅表示业务语义值。实体通常对相关的值对象和一致性规则进行分组

现在,有一个CRUD域或CRUD建模的例子,其中基本上只有一些数据结构和一些验证规则。如果建模是正确的,就不需要让你的生活复杂化。尽可能简单地实现事情


始终将DDD视为一种收集需求和构建信息的方法。代码(设计)中的实现是不同的。

DDD和数据是非常不同的东西。聚合的数据(结果)将以某种方式持久化,具体取决于您使用的内容。就我个人而言,我认为域内事件的结果是DTO(从技术上讲是),它可以直接存储在事件存储中(如果使用事件源),或者作为持久性模型的数据源

域模型表示相关的域行为,域状态为“结果”。实体是具有id的概念,而值对象仅表示业务语义值。实体通常对相关的值对象和一致性规则进行分组

现在,有一个CRUD域或CRUD建模的例子,其中基本上只有一些数据结构和一些验证规则。如果建模是正确的,就不需要让你的生活复杂化。尽可能简单地实现事情

始终将DDD视为一种收集需求和构建信息的方法。代码(设计)中的实现是不同的。

免责声明:这个答案比问题大一点,但需要理解问题;也是100%基于我的经验

你现在的感觉很正常,不久前我也有同样的感觉。这是因为体系结构、编程语言和使用的框架相结合。您应该尝试选择上述工具,以便它们提供最容易更改的代码。如果您必须为添加到实体的每个字段更改3个类,那么这将是大型项目中的噩梦(即50+实体类型)

问题在于每个实体/概念有多个DTO。

我使用的最重的架构是经典的分层架构;严格的版本是h