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