你是否将仓库注入到领域对象中?

3

在一周时间里,我每天学习领域驱动设计10个小时以上,开始感觉自己已经相当理解它了,直到今天读到这篇文章:

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

该文章作者表示需要将Repository注入到Domain对象中,但这对我来说毫无意义。

虽然我不是这方面的专家,但我认为他是错的。我希望从这里的一些人那里获得一些意见,是否将Repository注入到Domain对象中是正确的或错误的。

在上周的阅读中,每天我都会读一篇新的文章,它们听起来都很相似(这是件好事),直到我看到上面发布的文章,让我重新思考我的模式是否正确。

是否应该注入一个Repository?


1
可能是[DDD-实体不能直接访问存储库的规则]的重复问题。(https://dev59.com/nm025IYBdhLWcg3w960W) - meze
2
总结一下:这不仅是一个糟糕的做法,他的例子也很糟糕(UserRepository必须返回一个User对象的实例,除非你要求存储库进行一些计算/统计)。 - meze
谢谢回复。是的,我认为他根本不应该写关于DDD的文章。至少现在我知道,在过去的一周中,我确实学到了一些关于DDD的东西,如果我能意识到有人做错了它。虽然我还不是100%舒适,但我肯定很快会回来问更多问题。 - ibanore
类似的讨论请参考 https://dev59.com/LGYr5IYBdhLWcg3wAFvE - zafarkhaja
1个回答

6
展示的例子使用了Active Record模式。在这种模式下,实体知道如何保存自己。一般来说,这不被认为是良好的关注点分离,因为该类知道两件事情:数据属性如何持久化自身。
将存储库注入Active Record对象比我看到的某些Active Record实现要好(因为您至少可以替换存储库实现),但在我的观点中(以及大多数DDD社区中),依赖关系是反向的:

存储库应该依赖于它返回的对象,而不是相反的。 其原因是您的“域对象”(稍后会更详细地介绍)可以存在(并且应该是可测试的)而不需要加载或保存(也就是说,具有对存储库的依赖性)。

所以回答你的问题,不应该将存储库注入域对象中。
然而,值得注意的是,这并不是一个真正的域对象,因为它没有行为 - 只有简单的获取/设置(访问器/修改器)。它只是一个数据传输对象(DTO)。如果确实没有行为,您不需要域模型 - 这只是简单的CRUD。

所以假设我正在使用Elasticsearch来实现一些搜索行为,那么所有的搜索行为都来自ES,我不需要真正的业务逻辑。那么我应该只使用DTO。(我正在使用单独的搜索对象,其中仅包括搜索所需的字段)。 - Code Name Jack
是的,基本上就是这样。以下是我今天在类中如何建模:
  • SearchRequest(普通的DTO)
  • SearchRequestHandler(只有一个方法:Handle(),依赖于ES)
  • SearchResponse(普通的DTO)
- Josh Kodroff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接