angular - 为模块提供不同的服务

时间:2017-10-15 22:10:09

标签: javascript angular dependency-injection

我在为模块提供不同服务时遇到问题。

我有三个模块:ModuleA,ModuleB和ModuleShared。我希望ModuleA和B使用Injectin Token为ModuleShared提供不同的服务。 我试图这样做,但正如您所看到的,模块A和B中的组件仅使用服务B.如何向共享模块提供不同的服务?

---编辑---

ModuleA:

@Injectable()
export class ServiceA implements IMyService {
  getName(): string {
    return 'service A';
  }
}

@Component({
  selector: 'component-a',
  template: `
    <div>
      Cpomonent from Module A:
      <shared-component></shared-component>
    </div>
  `,
})
export class ComponentA {

}

@NgModule({
  imports: [
    ModuleShared
  ],
  declarations: [
    ComponentA
  ],
  exports: [
    ComponentA
  ],
  providers: [
    {
      provide: MY_SERVICE,
      useClass: ServiceA
    }
  ]
})
export class ModuleA {}

ModuleB:

@Injectable()
export class ServiceB implements IMyService {
  getName(): string {
    return 'service B';
  }
}

@Component({
  selector: 'component-b',
  template: `
    <div>
      Component from Module B:
      <shared-component></shared-component>
    </div>
  `,
})
export class ComponentB {

}
@NgModule({
  imports: [
    ModuleShared
  ],
  declarations: [
    ComponentB
  ],
  exports: [
    ComponentB
  ],
  providers: [
    {
      provide: MY_SERVICE,
      useClass: ServiceB
    }
  ]
})
export class ModuleB {}

SharedModule:

export interface IMyService {
  getName: string
};
export const MY_SERVICE = new InjectionToken<IMyService>('MyService');


@Component({
  selector: 'shared-component',
  template: `
    <div>
      <h3>Shared component, provided: {{serviceName}}</h3>
    </div>
  `,
})
export class ComponentShared {

  constructor(@Inject(MY_SERVICE) private myService: IMyService) {}

  get serviceName(): string {
    return this.myService.getName();
  }
}

@NgModule({
  declarations: [
    ComponentShared
  ],
  exports: [
    ComponentShared
  ]
})
export class ModuleShared {}

https://plnkr.co/edit/Lbr23I4wC2A0HruvMU6m?p=preview

1 个答案:

答案 0 :(得分:1)

仅当ModuleAModuleB是延迟加载的模块时,这才有效 否则它们都共享相同的提供者范围,随后使用相同密钥(MY_SERVICE)的注册提供者将覆盖先前注册的提供者。

延迟加载的模块引入了一个新的子范围,因此可以提供不会互相覆盖的不同提供者。