如何在角度2中使用Factory Provider

arj*_*soh 10 dependency-injection typescript angular

我需要将一个服务注入到Angular 2应用程序中的另一个服务中.在阅读了我推断的文档之后,最好的方法是使用Factory Provider.但是出现了两个问题:

1)文档建议创建一个HeroServiceProvider包含两个"代码段"的类:

let heroServiceFactory = (logger: Logger, userService: UserService) => {
  return new HeroService(logger, userService.user.isAuthorized);
};

export let heroServiceProvider =
  { provide: HeroService,
    useFactory: heroServiceFactory,
    deps: [Logger, UserService]
  };
Run Code Online (Sandbox Code Playgroud)

我的问题是这个班级应该怎么样?应该在哪里添加上述代码段?

2)如何/可以使用这家工厂?我明白了,它应该导入为:

import { heroServiceProvider } from './hero.service.provider';

@Component({
  selector: 'my-selector',
  template: `
  `,
  providers: [heroServiceProvider]
})
Run Code Online (Sandbox Code Playgroud)

那么如何才能检索和访问所需的参数化服务?

Raj*_*amy 16

我在app_initalizer上注入了相同的问题,经过长时间的搜索,我找到了下面的解决方案.可能这对您的方案有帮助.

@NgModule({
  imports: [ BrowserModule],
  ...
  providers: [
    {
      provide: HeroService,
      useFactory: heroServiceFactory,
      deps: [Logger, UserService],
      multi: true
    }
    ]
})
export class AppModule {}


export function heroServiceFactory = (logger: Logger, userService: UserService) => {
    return new HeroService(logger, userService.user.isAuthorized);
};
Run Code Online (Sandbox Code Playgroud)


小智 0

今天我遇到了同样的问题并找到了一些解决方案。

1)我在 angular.io 中找到了确切的代码,请参阅以下内容: https://github.com/angular/angular.io/blob/master/public/docs/_examples/dependency-injection/ts/src/app/heroes /hero.service.provider.ts (链接于 2017 年 3 月 15 日更新)。
从这段代码来看,heroServiceProvider 不需要是一个类。

2)在app.module.ts中,@NgModule中有providers属性。您可以在其中添加 HeroServiceProvider,如下所示:

import { heroServiceProvider } from './hero.service.provider';

...

@NgModule({

  ...

  providers: [
    heroServiceProvider
  ],
  bootstrap: [ AppComponent ]
})
Run Code Online (Sandbox Code Playgroud)

通过像这样在 @NgModule 中提供服务,您可以在应用程序范围内使用该服务。