导入时将实现传递给 Angular 模块

men*_*eno 3 dependency-injection angular

如果我有一个A依赖于某个服务的Angular 模块S。但我不想直接实现服务,而是想处理一个接口I,并让消费者A在导入它时传递实际的实现。该实现将是一个用 @Injectable 装饰的 Angular 服务,并且有自己的依赖项。

这在 Angular 中可行吗?若有,实施步骤为何?

Jot*_*edo 5

要存档此内容,您可以使用abstract classes而不是interfaces使实现可交换:

\n\n
app/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo.service.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 abstract-foo.provider.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo.module.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo.component.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.module.ts\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在有以下文件:

\n\n
// foo.service.ts\n@Injectable()\nexport class FooService extends AbstractFooProvider {\n   ctor(private _fooDependency: SomeOtherFooService){}\n   foo(): boolean {\n     return this._fooDependency.isFoo();\n   }\n}\n\n// foo.module.ts\n@NgModule({\n  declarations: [FooComponent],\n  exports: [FooComponent]\n})\nexport class FooModule {\n   static withConfiguration(implementationProvider: Provider): ModuleWithProviders {\n     return {\n        ngModule: FooModule,\n        providers: [implementationProvider]\n     };\n   }\n}\n\n// abstract-foo.provider.ts\nexport abstract class AbstractFooProvider {\n    foo(): boolean;\n}\n\n// foo.component.ts\n@Component({})\nexport class FooComponent {\n   ctor(private _fooProvider: AbstractFooProvider){}\n}\n\n// app.module.ts    \n\nexport const FOO_PROVIDER : ClassProvider = {\n  provide: AbstractFooProvider, \n  useClass: FooService\n};\n\n@NgModule({\n   imports: [\n      FooModule.withConfiguration(FOO_PROVIDER)\n   ]\n})\nexport class AppModule {}\n
Run Code Online (Sandbox Code Playgroud)\n