我特别指的是这个问题: DDD - 如何实施工厂
选定的答案说明:
“工厂不应该依赖于依赖注入,因为域对象不应该将依赖注入其中。”
我的问题是:无法向您的实体注入依赖项的原因是什么?或者我只是误解了这个陈述?有人可以澄清一下吗?
我特别指的是这个问题: DDD - 如何实施工厂
选定的答案说明:
“工厂不应该依赖于依赖注入,因为域对象不应该将依赖注入其中。”
我的问题是:无法向您的实体注入依赖项的原因是什么?或者我只是误解了这个陈述?有人可以澄清一下吗?
域对象不是工厂,回购等。它们只是实体,值对象,域服务和聚合根。也就是说,它们必须是封装业务域使用的数据,它们之间的关系以及域可以对该数据执行的行为(读取修改)的类。
存储库是一种抽象出您正在使用的持久性基础架构的模式。它在DDD中,因为它使您的应用程序与数据库分离,但并非所有DDD应用程序都需要甚至应该使用存储库。
Factory是一种隔离对象构造逻辑的模式。这也是DDD推荐的一个好习惯,但在所有情况下都不是真正需要的。
域对象不应该依赖于其他任何东西,因为它们是您应用的核心。一切都取决于他们。因此,保持它们不受其他依赖关系的影响会产生明确的单向依赖关系链,并减少依赖关系图。它们是不变量,模型,基础。改变它们,你可能需要改变很多东西。所以改变其他事情不应该迫使他们改变。
有点旧,但我真的想解决这个问题,因为我已经遇到了很多这样的问题,并表达了我对它的看法:
我经常听说Domain Objects不应该“依赖”东西。这是事实。我经常看到人们推断这意味着我们不应该这样做 注入 事物进入域对象。
这与依赖意味着相反。域名不应该依赖于其他项目,这是事实。但是,域可以定义自己的接口,然后其他项目可以实现,然后可以将其注入域中。众所周知,这就是所谓的依赖倒置(DI)。
那是 按照字面 与依赖相反。不允许DI进入域完全限制了你准确建模域名的能力,迫使奇怪的SRP违规,并且几乎杀死了域服务的可用性。
我真的觉得我必须在这里疯狂,因为我觉得每个人都读“领域必须没有任何依赖”然后认为“注入某些东西意味着你依赖它”并得出结论“因此我们可以不要将依赖关系注入域。
这给我们留下了很好的逻辑:
依赖性倒置==依赖性