您是否将存储库注入域对象?

iba*_*ore 3 php oop domain-driven-design repository

在每天 10 小时以上学习领域驱动设计一周后,我开始感觉自己开始很好地理解它,直到我今天阅读了这篇文章:

http://blog.fedecarg.com/2009/03/15/domain-driven-design-the-repository/

那篇文章的作者说你将 Repository 注入到 Domain 对象中,这对我来说没有任何意义。

我不是这方面的专家,但我认为他是错误的,但我希望这里的一些人提供一些关于将存储库注入域对象是对还是错的意见。

上周我每天都在阅读另一篇文章和另一篇文章,他们对我来说听起来都一样(这是一件好事),直到我看到我上面发布的文章,如果我的这张照片让我三思而后行模式不正确。

您是否应该注入存储库?

Jos*_*off 6

显示的示例使用Active Record 模式。在这种模式中,实体知道如何自救。这通常不被认为是好的关注点分离,因为该类知道两件事:数据属性如何持久化自身。

将存储库注入 Active Record 对象比我见过的一些 Active Record 实现要好(因为您至少可以换出存储库实现),但在我看来(以及大多数 DDD 社区)依赖是倒退的:

存储库应该依赖于它返回的对象,而不是相反。这样做的原因是您的“域对象”(稍后会详细介绍)可以存在(并且应该是可测试的)而无需加载或保存(即,依赖于存储库)。

所以要回答你的问题,不。您不应该将存储库注入域对象。

然而,值得注意的是,这并不是真正的域对象,因为它没有行为——只是简单的获取/设置(访问器/修改器)。它只是一个数据传输对象(DTO)。如果真的没有行为,则不需要域模型——它只是简单的 CRUD。