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

标签 angular dependency-injection

如果我有一个 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/

相关文章:

c# - 在 Autofac 中注册时如何避免使用 new 两次

c# - 依赖注入(inject) - 当前上下文中不存在名称 'Bind' - MethodAccessException 未处理

javascript - 图像压缩/调整大小非常慢

html - Angular 4 CLI ng build 不将 scss 转换为 css

angular - 如何在 Angular 2 的选择控件中显示占位符(空选项)?

angular - 如何将 FormGroup 对象绑定(bind)到 ModelClass 对象

c# - 将 Ninject 与 ServiceLocater 模式结合使用——好还是坏

angular - TrackBy 必须是一个函数,但在 Angular 2 中收到未定义?

java - 对这个工厂感到困惑,因为它看起来既不像抽象工厂也不像工厂方法

java - 使用 Guice 的通用类型提供程序