Search code examples
angulartypescriptangular7

Angular inject service into base class but not in sub-class and use the parent service in sub-classes


Using Angular 7 & Typescript: I have a base class that uses a lot of services and child classes (about 40 sub-class) and I don't want to add those services in all subclass constructor and pass them to super() but I still need to use those services in all subclass.


export class parentTool {

    constructor(type: string, public service1: Service1, public service2: Service2,public service3: Service3, public service4: Service4){}
}

export class ChildTool1 extends parentTool {

    constructor(public service1: Service1, public service2: Service2,public service3: Service3, public service4: Service4) {

        super("tool1", service1, service2, service3, service4);
    }
}

export class ChildTool2 extends parentTool {

    constructor(public service1: Service1, public service2: Service2,public service3: Service3, public service4: Service4) {

        super("tool2", service1, service2, service3, service4);
    }
}

Solution

  • I use to have the same problem so I end up doing manulay DI (dependency injection) by using injector service

    this static class use to store a refrence of injector service

    export class AppInjector {
    
      private static injector: Injector;
    
      static setInjector(injector: Injector) {
        AppInjector.injector = injector;
      }
    
      static getInjector(): Injector {
        return AppInjector.injector;
      }
    }   
    

    at app module I set the injoctor service

    export class AppModule { 
      constructor(injector:Injector){
          AppInjector.setInjector(injector);// save a injector ref 💾
      }
    }
    

    you need to store the service before you start do any DI (dependency injection)

    in the base component

    export class BaseComponent {
      protected utilitiesService: UtilitiesService; // 👈 service
      protected loggingService: LoggingService; // 👈 service
    
      constructor() {
    
          const injector = AppInjector.getInjector();
    
          this.utilitiesService = injector.get(UtilitiesService); // 🌟 DI
          this.loggingService = injector.get(LoggingService); // 🌟 DI
    
    
      }
    
    }
    

    child class now have access to all service injected by the injector class 🎉🎉

        export class ChildComponent extends BaseComponent {
          constructor() {
            super();
          }
        }
    

    demo 🔥🔥