我在为模块提供不同服务时遇到问题。
我有三个模块: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 {}
答案 0 :(得分:1)
仅当ModuleA
和ModuleB
是延迟加载的模块时,这才有效
否则它们都共享相同的提供者范围,随后使用相同密钥(MY_SERVICE
)的注册提供者将覆盖先前注册的提供者。
延迟加载的模块引入了一个新的子范围,因此可以提供不会互相覆盖的不同提供者。