Angular:在具有所有依赖项的组件中提供类

时间:2017-07-21 11:48:32

标签: angular typescript dependency-injection

在Angular(4+)中,我想知道如何提供一个包含该类所有依赖关系的可注入类。

示例:

DepMaster是一个注射器,它又注入了依赖关系,即:

DepServantA
DepServantB

如果我提供DepMaster,我还必须提供所有依赖项和子依赖项。以下不起作用:

@Component({
    // ...
    providers: [
       DepMaster
    ]
})

为了使它工作,我必须写

@Component({
    // ...
    providers: [
       DepMaster
       DepServant1,
       DepServant2,
    ]
})

提供DepMaster时,我不想打扰DepMaster的哪些依赖关系。我只想提供DepMaster及其所有依赖项。

必须列出所有依赖项和子依赖项是不可能的。每当子依赖项发生变化时,我都必须更新用法。 这种方式的使用取决于实现细节。

2 个答案:

答案 0 :(得分:1)

对于这种要求,您可以为这些依赖项创建单独的模块,并为此类DepMaster创建

@NgModule({
    declarations: [  ],
    imports: [],
    providers: [
       DepMaster,
       DepServant1,
       DepServant2,]
})
export class DevMasterModule { }

然后在您希望提供这些服务的模块中导入此模块。例如

 @NgModule({
     declarations: [
            AppComponent
          ],
     imports: [
            BrowserModule, ReactiveFormsModule, DevMasterModule 
          ],
     providers: [],
     bootstrap: [AppComponent]
    })
 export class AppModule { }

答案 1 :(得分:0)

我的解决方案是在我的主类中有一个依赖项列表。然后我可以将这个列表与大师班一起提供。

@Injectable()
export class MyMaster {

   // list of dependencies which have to be provided for this class
   static readonly PROVIDES: any = [
      AuGridBuilder,
      AuTableManager,
      AuTabBuilder,
      ApMenuBuilder
   ].concat(
      AuGridBuilder.PROVIDES,
      AuTableManager.PROVIDES,
      AuTabBuilder.PROVIDES,
      ApMenuBuilder.PROVIDES
   );

   constructor( private gridBuilder: AuGridBuilder,
                private tableManager: AuTableManager,
                private tabBuilder: AuTabBuilder,
                private menuBuilder: ApMenuBuilder )
   {
      // ...
   }

这是在每个注射类中完成的。 然后在模块中,我可以轻松地提供主服务器及其所有必需的依赖项:

providers: [ MyMaster, MyMaster.PROVIDES ]