如果我有一个 Angular 模块 A
依赖于某个服务 S
。但是我不想直接实现服务,而是想处理一个接口(interface) I
并让 A
的消费者在导入时传递实际实现。该实现将是一个用 @Injectable 装饰的 Angular 服务,并且有自己的依赖项。
这在 Angular 中可行吗?如果是,实现步骤是什么?
最佳答案
要归档这个,您可以使用抽象类
而不是接口(interface)
来使实现可交换:
app/
├── foo.service.ts
├── foo/
│ ├── abstract-foo.provider.ts
│ ├── foo.module.ts
│ ├── foo.component.ts
├── app.module.ts
现在有以下文件:
// foo.service.ts
@Injectable()
export class FooService extends AbstractFooProvider {
ctor(private _fooDependency: SomeOtherFooService){}
foo(): boolean {
return this._fooDependency.isFoo();
}
}
// foo.module.ts
@NgModule({
declarations: [FooComponent],
exports: [FooComponent]
})
export class FooModule {
static withConfiguration(implementationProvider: Provider): ModuleWithProviders {
return {
ngModule: FooModule,
providers: [implementationProvider]
};
}
}
// abstract-foo.provider.ts
export abstract class AbstractFooProvider {
foo(): boolean;
}
// foo.component.ts
@Component({})
export class FooComponent {
ctor(private _fooProvider: AbstractFooProvider){}
}
// app.module.ts
export const FOO_PROVIDER : ClassProvider = {
provide: AbstractFooProvider,
useClass: FooService
};
@NgModule({
imports: [
FooModule.withConfiguration(FOO_PROVIDER)
]
})
export class AppModule {}
关于angular - 导入时将实现传递给 Angular 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48356870/