【发布时间】:2018-04-13 19:04:19
【问题描述】:
如果有人说,请原谅我不理解。
为什么它的依赖注入器的 Angular 实现通过
constructor使用注入器?
我习惯于以各种方式看到DI。即使是静态方法也有意义(如果存在,抱歉我还没有深入挖掘,到目前为止我已经研究了一周)。
这样使用会不会更容易或更合乎逻辑,更类似于我们经常看到的 DI 但仍然在构造函数中传递它?:
// Non-Angular Example
@Component({})
class FooComponent {
public appState: AppState;
constructor(DI: DependencyInjector) {
this.appState = DI.get('AppState');
}
ngOnInit() {}
}
Angular 更像是这样,我不确定它是否只是为了冗长,还是有其他原因。
// Angular 2/4 Example
@Component({})
class BarComponent {
public appState: AppState;
constructor(appState: AppState,
router: Router,
etc: EtcSomething) {
}
ngOnInit() {}
我知道 Google 已经想到了这一点,我只是想了解其中的原因和/或好处。也许我醒来时想到了一些愚蠢的事情,这很明显,只是我的头晕目眩,但我错过了。
我希望我的问题是有道理的,我只是想知道为什么。
【问题讨论】:
-
因为那不再是依赖注入了。依赖注入的原理是将依赖注入到组件中。 BarComponent 的依赖项是路由器、appState 等。唯一注入的东西是注入器,它充当工厂。它不再是 DI,并且使事情更难测试。我不确定你在哪里见过一个依赖注入框架,它除了注入器之外不注入任何东西。
-
您可以只注入注入器,然后使用它手动注入,但这会掩盖依赖关系并使 typescript 编译器的帮助降低,因此您只是无缘无故地自取其辱。
-
谢谢大家,有人想把其中一个 cmets 作为答案,让我标记一下吗?您能否澄清这是否是 Angular 特定的 DI,而不是一般的 DI?任何语言的通用 DI 处理方式都与我的经验大不相同;但是,这是一种原型语言,因此可能会有所不同。我并不反对它的用途,我试图理解它的目的。 :)
-
@JBNizet 据我了解(尽管可能是错误的),在 Angular 之外,第一个示例仍被视为依赖注入。我认为 Angular 的流行让人们认为所有的 DI 都像 Angular DI。参考:stackoverflow.com/a/130862/846550 以及关于该问题的其他答案。
-
对于OP的第一个DI示例,优点是不需要对语言特性进行任何修改,也不需要引入神奇的保留参数名称。我能看到的唯一缺点是样板文件略多(与 OP 相比,在 DI 中隐藏更多的样板文件是可能的)。所以我也很好奇为什么 Angular 会这样做;这是个好问题。
标签: angular