Angular 2 中的依赖注入在使用内联注入器和构造器注入时创建多个实例

Posted

技术标签:

【中文标题】Angular 2 中的依赖注入在使用内联注入器和构造器注入时创建多个实例【英文标题】:Dependency Injection in Angular 2 Creates Multiple Instances while using Inline Injector and Constructor Injection 【发布时间】:2016-09-09 14:04:50 【问题描述】:

我正在开发一个 Ionic 2 TypeScript 项目。 在应用程序启动期间,我通过构造函数注入服务。

@App(
    providers: [ MyService ]
)
export class MyApp 
   constructor( private instance1 : MyService )

在另一个班级我使用

let injector = Injector.resolveAndCreate ( [ MyService ] );
let instance2 = injector .get( MyService  );

我得到了变量 instance1 和 instance2 的两个不同实例。

有没有办法通过使用内联注入器和构造器将它们作为一个实例

【问题讨论】:

这种行为是预期的(见我的回答)。为了能够提出解决方法,我需要更多地了解您的用例。 【参考方案1】:

每个提供程序实例都维护“单例”。如果您创建一个新的InjectorInjector.resolveAndCreate ( [ MyService ] ); 就是这样做的,那么它也有自己的提供程序实例。因此行为是预期的。

您可以将Injector 注入您的组件和服务并创建一个子注入器,然后它可以按预期工作。

如果您需要一个无法注入 Angular 注入器的注入器,此评论中解释了一种解决方法(使用 Plunker)https://github.com/angular/angular/issues/4112#issuecomment-153811572

【讨论】:

只需添加injector:Injector 作为构造函数参数。您可以使用它来请求实例(我认为是injector.get(SomeType))或创建子注入器。我只是在打电话,所以没有更多细节。

以上是关于Angular 2 中的依赖注入在使用内联注入器和构造器注入时创建多个实例的主要内容,如果未能解决你的问题,请参考以下文章

Angular依赖注入小解

[AngularJS面面观] 20. 依赖注入 --- instance注入器以及provider注入器

如何使用 Angular 中的依赖注入将属性指令实例传递给嵌套组件

翻译对比Angular1和Angular2中的依赖注入

Angular 2.3 组件继承和依赖注入

Angular 2.3 组件继承和依赖注入