使用ReflectiveInjector注入服务,而不指定依赖关系树中的所有类

时间:2016-11-03 13:00:50

标签: angular dependency-injection

我目前有一个为我生成一个对象的服务,它应该表现为一种活动记录,因为它可以随意填充自己作为访问它的属性。

我的第一种方法是将生成的对象使用的服务注入到创建服务中,并将它们传递给创建的对象的构造函数,但由于创建服务从不使用这些服务,所以它看起来很脏。

第二个用途是使用ReflectiveInjector:

let injector = ReflectiveInjector.resolveAndCreate(
                    [
                        ClassToBeCreated,
                        ServiceA,
                        ServiceB,
                        ServiceC
                    ]
                )
let created = injector.get(ClassToBeCreated)

但这会崩溃:

EXCEPTION: No provider for Http! (ClassToBeCreated -> ServiceA -> Http)

如果我在resolveAndCreate中指定Http,它将失败,并具有Http的下一个依赖项。

有没有办法注入而不必在树上指定所有依赖项并让角度处理它?<​​/ p>

我是否以一种根本错误的方式处理这个问题?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

您可以创建已注册这些提供程序的父注入器的子注入器:

constructor(private injector:Injector) {}

...

someMethod() {    
  let resolvedProviders = ReflectiveInjector.resolve([Car, Engine]);
  let child = ReflectiveInjector.fromResolvedProviders(resolvedProviders, this.injector);
}

另见Injecting different providers while loading components using ComponentResolver in Angular 2