DDD 域实体与持久性实体

Posted

技术标签:

【中文标题】DDD 域实体与持久性实体【英文标题】:DDD Domain Entity vs Persistence Entity 【发布时间】:2020-05-18 08:14:54 【问题描述】:

在 DDD 中,我们说域实体不是数据库模型/实体的表示。我们还说,为了正确地从应用程序中提取领域模型,领域模型不应该有任何关于其持久化方式或返回给客户端的方式的信息。

我遇到的问题是,在处理大多数 ORM 或数据库抽象时,我们需要使用一些特定于数据库的注释来注释数据库实体,从而违反规则。

这是否意味着我们应该为域创建一个实体,为持久化创建另一个实体?

我是新手,不确定正确的方法是什么。

【问题讨论】:

【参考方案1】:

领域模型往往是一个相当封装的事情。因此,当涉及到 ORM 实体时,此类域对象不是很好的候选对象。

如果您的域实体看起来像数据容器,这样它们就可以用作 ORM 实体,如果装饰有一些属性,那么您的域充其量是没有封装的,最坏的情况是一个贫血模型。

在我看来,您通常最终会得到一个域模型和某种形式的面向数据的 ORM 模型。

顺便说一句:

一旦您开始询问您的 ORM 为表带来了什么,您可能想了解通过放弃 ORM 并使用其他一些原始/较低级别的数据访问技术会损失多少。甚至可能会有一些性能提升。如果我对此事有发言权,我不会使用 ORM。

【讨论】:

以上是关于DDD 域实体与持久性实体的主要内容,如果未能解决你的问题,请参考以下文章

持久性无知和 DDD 现实

在具有多个数据库的域驱动设计DDD上添加项目的最佳方法是什么?

将 DDD 应用于罗斯文数据库

以下代码是不是违反持久性无知规则

细粒度与粗粒度域模型在内存数据网格中

业务问题与持久性问题