避免贫血域模型如何与 ORM、依赖注入和可靠方法一起使用

Posted

技术标签:

【中文标题】避免贫血域模型如何与 ORM、依赖注入和可靠方法一起使用【英文标题】:How does avoiding anaemic domain models work with ORMs, Dependency Injection and a Solid approach 【发布时间】:2013-12-06 22:19:26 【问题描述】:

查看了域驱动设计并阅读了贫血域模型是一种反模式,认为好吧也许应该将更多行为放入我们的域实体中。行为需要使用 SOLID 方法来处理灵活性,因此需要 DI 框架和容器来允许将一些行为注入实体。

但是,在连接实体时似乎存在不匹配,因为我们的实体将来自诸如实体框架或 NHibernate 之类的 ORM 框架,而行为则来自依赖注入容器。

我猜你需要一种方法让 ORM 也插入一个 DI 容器。

只是想知道其他人在想要获得更丰富的模型但也使用 ORM 和 DI 容器时是如何解决这个问题的。

【问题讨论】:

DDD Usually does not inject sth to the entities. 除了不向实体注入任何东西外,我还尽最大努力避免使用 ORM。我仍然做我自己的持久性/映射,但它让我的领域完全不了解持久性。对于 ORM,您可能需要另一个面向 DB 的层或摆弄您的域,即使这意味着只是使方法虚拟化。 我的 ORM 实体与我的域实体是分开的。 只需查看 DDD 示例应用程序:dddsample.sourceforge.net DI 与行为有什么关系?行为必须嵌入到您的域(实体和服务)中,而不注入任何第三方组件。 【参考方案1】:

1- 使用 ORM 实体作为您的域实体不是一个好主意。因为您的域实体构成了 DDD 应用程序的核心,并且应该具有最少的依赖关系。如果你决定在未来改变你的 ORM 怎么办? ORM 可以在您的存储库中使用,但请记住,您需要在存储库返回它们之前将 ORM 实体映射到您的域实体。

2- 您的域实体应该具有行为,但它们仅限于该实体。任何涉及其他服务或依赖项的行为都应该转到域服务。因此,您的域实体不会依赖其他服务。它们通常甚至不需要抽象,因此不需要使用 IoC 容器来解析。

【讨论】:

【参考方案2】:

在观看了 Jimmy Bogard 的 this excellent video 关于制作邪恶的领域模型的文章后,我想到了一个可能的答案。

因此,您的域模型包含行为和丰富的方法,但是您将特定行为注入到域模型的方法中,这些行为实现了一些接口并且是您可以从 DI 容器中获取的一些功能。

因此,通过更改您注入模型的内容,我们可以使用 DI 更改其行为,同时仍然拥有丰富的域模型并通过 ORM 从数据库中检索它。

【讨论】:

以上是关于避免贫血域模型如何与 ORM、依赖注入和可靠方法一起使用的主要内容,如果未能解决你的问题,请参考以下文章

贫血域模型和活动记录之间的区别

贫血领域模型与领域模型

如何使用automapper映射与多个表的数据集

贫血模型跟充血模型-摘录

什么是贫血什么是充血呢?

AutoMapper