为什么在构造函数中创建依赖项是个坏主意?

Why is creating a dependency inside the constructor a bad idea?

我很难理解为什么违反规则是不好的 ))

   import {DepClass} from './di-import' // <- some dependency imports here

   class DI1 {
     dep1: DepClass
     constructor(){
       this.dep1 = new DepClass() // <- bad
     }
     ...... 
     }

    class DI2 {
      dep2: DepClass
      constructor(d: DepClass){     // <- slightly better
        this.dep2 = d
      }
      ......
    }

所以,我知道,class 不应该自行创建其依赖项的实例,这违反了 IoC 规则。但这有什么可怕的呢?开销是多少?

“内联”在构造函数中创建依赖项的实例与将已存在的依赖项的副本作为参数传递给构造函数之间的工作区别是什么?除了两个 classes 都工作正常之外))

有一个想法。也许,所有这些只是 DI 容器正常工作所需要的,它会仔细查看构造函数参数。

提前致谢

constructor(){
  this.dep1 = new DepClass() // <- bad
}

在这里你创建了一个新的DepClass实例,当你创建一个从属class的实例时。


constructor(d: DepClass){     // <- slightly better
  this.dep2 = d
}

此处依赖注入框架为您实例化了一个 DepClass,并将其提供给任何想要访问该实例的 classes。


如果许多 class 依赖于 DepClass 那么,在第一个示例中,您会得到许多 class 在构建这些对象期间专门创建的实例。

在第二个示例中,只创建了一个 DepClass 的实例,并且在构建后与任何声明它为依赖项的 class 共享。

对于像这样的小人为示例,依赖注入看起来不是一个好主意。但是,随着您的应用扩展,并且您有数十个 class 元素,每个元素都有很多依赖项,保持这种清洁开始变得非常有用。