用于模块中单独服务实例的useFactory Provider

时间:2019-04-22 05:48:44

标签: angular service

this

有关

我有以下代码

const MyType1Factory = () => {
  return new MyService<Type1>();
};

export let MyType1Provider =
{
  provide: MyService,
  useFactory: MyType1Factory,
};

const MyType2Factory = () => {
  return new MyService<Type2>();
};

export let MyType2Provider =
{
  provide: MyService,
  useFactory: MyType2Factory,
};

现在,我尝试将此服务的两个不同实例注入到我的模块中,以便可以从该模块的任何组件访问我的两个实例

@NgModule({
  ...
  providers: [MyType1Provider , MyType2Provider ]
})

但是我不完全知道如何在子组件中检索此实例。

此外,这是正确的实现吗?

编辑:

我还尝试在模块中添加以下内容

export const MyType2 = new InjectionToken<MyService<Type2>>('Type2');
export const MyType1 = new InjectionToken<MyService<Type1>>('Type1');

  providers: [
    { provide: MyType2, useFactory : MyType2Factory },
    { provide: MyType1 , useFactory: MyType1Factory }
]

以及组件中的以下内容。

  constructor(@Inject(MyType2) private MyType2: MyService<Type2>,
              @Inject(MyType1 ) private MyType1 : MyService<Type1>) { }

但这给了我

  

compiler.js:2430未捕获的错误:无法解析所有参数   NavigationIndexComponent:(?,?)。

这是一堆https://stackblitz.com/edit/angular-htpqms

1 个答案:

答案 0 :(得分:0)

stackblitz项目中有2个问题

写useFactory而不是useClass,因为您使用的是工厂方法而不是类进行实例化。 将令牌实例化写入不在app.module.ts中的其他文件中,这会导致循环依赖,因为app.module.ts导入my-component.component.ts文件,而my-component.component.ts导入app.module.ts,例如token.ts文件,然后从那里导入app.module和my-component.component

     import { NgModule, InjectionToken } from '@angular/core';
     import { SynchronizatorService } from './synchronizator.service';


     export const SYNCH_STRING = new InjectionToken<SynchronizatorService<string, string>>('SynchMapToken');
    export const SYNCH_NUMBER = new InjectionToken<SynchronizatorService<number, number>>('SynchWaypointToken');