Dependency injection Angular2-从根/应用程序注入器检索已缓存的实例

Dependency injection Angular2-从根/应用程序注入器检索已缓存的实例,dependency-injection,angular,Dependency Injection,Angular,是否有可靠的方法从根注入器检索已创建的实例?我的用例是,我需要自己实例化一个类型(使用new构造),但在设置所述类型时,我需要获取两个Angular2注入器管理的实例 app: ApplicatinRef; 其中,通过DI本身检索上述app变量 const rootInjector: Injector = app.injector; rootInjector.get(SomeInstance); 当我使用上述代码时,SomeInstance类型将再次实例化,我希望它能够检索到在引导过程中创

是否有可靠的方法从根注入器检索已创建的实例?我的用例是,我需要自己实例化一个类型(使用
new
构造),但在设置所述类型时,我需要获取两个Angular2注入器管理的实例

app:  ApplicatinRef;
其中,通过DI本身检索上述
app
变量

const rootInjector: Injector = app.injector;
rootInjector.get(SomeInstance);
当我使用上述代码时,
SomeInstance
类型将再次实例化,我希望它能够检索到在引导过程中创建的相同实例

不过,当我打电话时,请注意

rootInjector.get(SomeInstance);
在最初调用它多次后,它不会再次实例化它。所以它只实例化两次:在引导过程中和第一次调用注入器本身时

DI层次结构中的
SomeInstance
没有其他提供程序,仅在引导时在应用程序级别指定


我遗漏了什么吗?

您不需要以这种方式获取喷油器,因为您已经在喷油器中进行了喷油。如果没有在任何其他位置提供实例,则该实例对于层次结构中的所有组件都是相同的。此外,您不需要直接使用注入器,您可以在构造函数中请求您的服务实例,如下所示:

...
constructor(private serviceInstance : ServiceClassName){
    this.serviceInstance.doSomething();
}
如果在主组件中提供,则此实例在所有组件中都是相同的:

import { provide } from '@angular/core';
...
bootstrap(..., provide(ServiceClassName, {useClass : ServiceClassName}));
但您可以使用providers配置参数在层次结构的任何位置添加此实例:

import { provide } from '@angular/core';
...
@Component({
...
providers : [provide(ServiceClassName, {useClass : ServiceClassName})]
})

这样做只会为该组件及其子组件创建一个实例。

我是这样理解的,但这就是我的问题所在。我正在处理一个我绝对不想交给DI容器来处理该实例的实例。我需要自己创建它(需要完全控制),但在我控制的实例中,我需要由Angular2注入器管理的其他类型的2个实例。因此,当我实例化该类型时,我想从注入器中获取其他2个实例。我已经实现了一个解决方案,但我希望有更干净的东西,我可以直接询问Angular2 API,而不是实现我自己的hack。哼。。我不知道你的代码是如何工作的,但是你也可以在工厂中使用DI。在函数内部,您可以使用注入器获取角度实例,并自己创建自定义实例。类似这样的内容:引导(…,提供(ServiceClassName,{useFactory:()=>{/*injector and special logic*/返回新的ServiceClassName(injectorInstance1,injectorInstance2,specialInstance);}});这也许是我可以尝试的东西。将为我的代码如何工作的问题添加更多细节。基本上是一个
User
域对象(其中的实例永远不会来自DI),我需要用
ListContainer
s构建它,而正是这些容器需要来自DI系统的实例。为什么不使用服务来提供这个特殊实例呢?通过这种方式,您的值可以更改,但您的界面将保持不变。现在,我将事情分解到一个工厂,因此,我没有直接创建
用户
域实例,而是将其交给一个工厂,该工厂还将相应地设置上述
列表容器
s。然而,我仍然没有通过Angular2的DI系统来实现这一点。