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

时间:2013-01-05 20:12:33

标签: php oop repository domain-driven-design

经过一周的关于领域驱动设计的一周学习后,我开始觉得自己开始明白这一点,直到今天我读到这篇文章:

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

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

我不是这方面的专家,但我认为他错了,但我想在这里向一些人提供一些关于将存储库注入域对象是对还是错的建议。

我每天阅读上一周的所有内容,因为我读了另一篇文章,而另一篇文章对我来说都是一样的(这是一件好事),直到我看到上面发布的文章,它让我三思而后行这种模式的图片不正确。

您或者您不应该注入存储库吗?

1 个答案:

答案 0 :(得分:4)

显示的示例是使用Active Record pattern。在这种模式中,实体知道如何保存自己。这通常不被认为是好的Separation of Concerns,因为该类知道两件事:数据属性如何保持自己。

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

  

存储库应该依赖于它返回的对象,而不是其他对象   四处走走。原因是你的“域对象”(更多关于   以后)可以存在(并且应该是可测试的)而不被加载或   已保存(即依赖于存储库)。

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

然而,值得注意的是,这不是一个真正的域对象,因为它没有行为 - 只是简单的get / sets(访问器/ mutators)。这只是一个Data Transfer Object (DTO)。如果真的没有行为,你就不需要域模型 - 它只是简单的CRUD。