依赖注入期间专门化类

时间:2017-01-04 07:55:09

标签: angular typescript

我有一般的服务类和专门的服务类和公共组件,它们应该使用specialzied服务,具体取决于模块。

我在UpdateFormComponent中有SharedModule - 对于应用程序中的所有其他模块都是通用的。在实例化期间,我应该通过AbstractSaveService - Module1SaveServiceModule2SaveService的后代。这些服务在其他模块Module1Module2中声明。

所以文件结构将是

\shared\shared.module.ts
        update.form.component.ts
        abstract.service.ts
\module1\save1.service.ts (extends AbstractSaveService)
         users.component.ts (use UpdateFormComponent and Module1SaveService)
\module2\save2.service.ts (extends AbstractSaveService)
         cameras.component.ts (use UpdateFormComponent and Module2SaveService)
@Component({
    selector: 'update-form-component'
})
class UpdateFormComponent {
    constructor (private s: AbstractSaveService) {}
}
@Component({
    selector: 'users-component',
    template: '<update-form-component></update-form-component>' // inject Module1SaveService
})
export class UsersComponent {}
@Component({
    selector: 'cameras-component',
    template: '<update-form-component></update-form-component>' // inject Module2SaveService
})
export class CamerasComponent {}

当我显示来自Module1UsersComponent)和用户按下按钮的页面时,我希望显示UpdateFormComponent并注入Module1SaveService。当我显示来自Module2CamerasComponent)和用户按下按钮的页面时,我想显示注入UpdateFormComponent的{​​{1}}。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以将Special1Service添加到一个MyComponentSpecial2Service的父级的提供商,添加到其他MyComponent的父级的提供商。这意味着只有当两个组件都具有不同的父组件时,这才有效。

@Component({
  selector: 'parent1',
  providers: [{provide: GeneralService, useExisting: Special1Service}],
  template: `<my-component></my-component>`
})
export class Parent1Component {
  constructor(private generalService:GeneralService) {}
}
@Component({
  selector: 'parent2',
  providers: [{provide: GeneralService, useExisting: Special2Service}],
  template: `<my-component></my-component>`
})
export class Parent1Component {
  constructor(private generalService:GeneralService) {}
}
@NgModule({
  providers: [Special1Service, Special2Service]
  ...
})
export class AppModule {}