如何使用 angular2 依赖系统手动注册提供者的实例

How to manually register an instance of a provider with angular2 dependancy system

我正在使用 Angular2 和 OpenFin 构建应用程序。我有一个服务 class 被标记为 Injectable 并且在 NgModule 中被列为提供者。它被注入到组件中,但只有在创建组件时才会实例化我的服务 class。我希望在应用程序启动时创建服务 class,而不管我的组件是否已创建,但是当我创建组件时,我预先创建的实例应该被注入到组件中。

我怀疑我想做的是在启动时创建一个服务实例,然后将其传递给 Angular 以告诉它在任何组件需要它时使用该实例。这是可能的还是我必须依赖 Angular 来实例化我的服务。

谢谢 安迪

在 AppModule 的提供者元数据中注册您的服务将使该服务可用于应用程序中的任何组件。

import { YourService } from './your-service.service';

@NgModule({
  declarations: [
    AppComponent,
    ...
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    ...
  ],
  providers: [YourService], // YourService as a provider to the application
  bootstrap: [AppComponent]
})
export class AppModule {
  constructor(private yourService: YourService){
    this.yourService.Init();
  }
}

这与在应用程序启动时向容器注册单例相同。 Angular 会处理剩下的事情。

希望对您有所帮助!

要做到这一点,只需在 rootcomponent@ngModule 装饰器中注册您的服务,如下所示,

@NgModule({
  ...
  ...
  providers:[AppService],   //scoped to entire application
  ...
})

现在,只要需要,就可以在任何组件中使用此服务。

注意 :不要在任何单独的组件中尝试 use/register providers:[AppService]。如果您尝试这样做,它将创建一个仅作用于该组件的不同实例。

Angular DI 是惰性的,但是有一个技巧可以使服务实例化变得急切:你需要实现 OnDestroy 接口。

您可以将其提供为 APP_INITIALIZER:

providers: [{provide: APP_INITIALIZER, useClass: YourService, multi: true}],

https://angular.io/docs/ts/latest/api/core/index/APP_INITIALIZER-let.html