域对象是否应该注入依赖项?

n3w*_*3wb 14 domain-driven-design dependency-injection

我特别指的是这个问题: DDD - 如何实施工厂

选定的答案说明:

"工厂不应该依赖于依赖注入,因为域对象不应该将依赖注入到它们中."

我的问题是:无法向您的实体注入依赖项的原因是什么?或者我只是误解了这个陈述?有人可以澄清一下吗?

Rip*_*ash 12

有点老了,但我真的想解决这个问题,因为我已经遇到过这个问题,并对此表达了我的意见:

我经常听说Domain Objects不应该"依赖"东西.这是事实.我经常看到人们推断这意味着我们不应该东西注入域对象.

这与依赖意味着相反.域名不应该依赖于其他项目,这是事实.但是,域可以定义自己的接口,然后其他项目可以实现,然后可以将其注入域中.众所周知,这就是所谓的依赖倒置(DI).

这与依赖性完全相反.不允许DI进入域完全限制了你准确建模域名的能力,迫使奇怪的SRP违规,并且几乎杀死了域服务的可用性.

我真的觉得我必须在这里疯狂,因为我觉得每个人都读"领域必须没有任何依赖"然后认为"注入某些东西意味着你依赖它"并得出结论"因此我们可以不要将依赖关系注入域.

这给我们留下了很好的逻辑:

依赖性倒置==依赖性

  • 我认为您在回答中将“域对象”与“域服务”混淆了。这里的“域对象”指的是实体(或模型),在域驱动设计中,它们不应该注入依赖项。 (2认同)

Did*_* A. 5

域对象不是工厂、存储库等。它们只是实体、值对象、域服务和聚合根。也就是说,它们必须是封装了您的业务域使用的数据、它们之间的关系以及域可以对该数据执行的行为(读取修改)的类。

存储库是一种抽象您正在使用的持久性基础架构的模式。它在 DDD 中,因为它使您的应用程序与数据库分离,但并非所有 DDD 应用程序都需要甚至应该使用存储库。

工厂是一种隔离对象构造逻辑的模式。这也是 DDD 推荐的一种很好的做法,但并非在所有场景中都真正需要。

域对象不应该依赖于其他任何东西,因为它们是应用程序的核心。一切都取决于他们。因此,让它们不受其他依赖的影响,可以形成清晰的单向依赖链,并减少依赖图。它们是不变量、模型、基础。改变它们,你可能需要改变很多东西。所以改变其他事情不应该强迫他们改变。

  • 域对象可能是代表域实体的对象,但将它们视为没有正确行为的愚蠢值对象,仅提取该行为以分离服务(据我了解您的说法)并不是 DDD。对我来说 DDD 就像分解一个人:你有一个名为“Human”的聚合根,包含“Body”、“LeftArm”、“RightArm”、“LeftLeg”、“RightLeg”和一个“Head”,它们本身可以有行为( Left/RightLeg.moveForward(), Left/RightHand.makeAFist()) 然后可以通过将行为委托给某些肌肉来实现。 (4认同)