Angular 将服务注入基础 class 但不注入子 class 并在子 class 中使用父服务
Angular inject service into base class but not in sub-class and use the parent service in sub-classes
使用 Angular 7 和 Typescript:我有一个基础 class,它使用大量服务和子 classes(大约 40 个子 class)和我不想在所有 subclass 构造函数中添加这些服务并将它们传递给 super()
但我仍然需要在所有 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);
}
}
再添加一项服务并在其中注入所有必需的服务。我们可以简单地在 sub class 中添加该服务,然后将其传递给 super.
中的父级
@injectable()
export class ParentService {
constructor(type: string, private service1: Service1, private service2: Service2,private service3: Service3, private service4: Service4){}
executeService1(){
this.service1.method1();
}
}
export class parentTool {
constructor(private parentService: ParentService){}
}
export class ChildTool1 extends parentTool {
constructor(public parentService: ParentService) {
super("tool1", parentService);
}
}
export class ChildTool2 extends parentTool {
constructor(public parentService: ParentService) {
super("tool2", parentService);
}
}
我曾经遇到过同样的问题,所以我最终使用 injector
服务
进行了 manulay DI(依赖注入)
这个静态 class 用于存储注入器服务的引用
export class AppInjector {
private static injector: Injector;
static setInjector(injector: Injector) {
AppInjector.injector = injector;
}
static getInjector(): Injector {
return AppInjector.injector;
}
}
在应用程序模块中我设置了 injoctor 服务
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)
在基础组件中
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 现在可以访问注入器注入的所有服务 class
export class ChildComponent extends BaseComponent {
constructor() {
super();
}
}
您可以使用全局注入器来防止在所有子 类 中注入所有服务。
在您的情况下,它将是这样的:
import {Injector} from '@angular/core';
//other imports
export class parentTool {
public service1: Service1
public service2: Service2
public service3: Service3
public service4: Service4
constructor(type: string,injector: Injector){
this.serviceInject1 = injector.get(Service1);
this.serviceInject2 = injector.get(Service2);
this.serviceInject3 = injector.get(Service3);
this.serviceInject4 = injector.get(Service4);
}
}
export class ChildTool1 extends parentTool {
constructor(injector: Injector) {
super(injector);
this.service1.someMethodCall()
}
}
export class ChildTool2 extends parentTool {
constructor(injector: Injector) {
super(injector);
this.service1.someMethodCall()
}
}
使用 Angular 7 和 Typescript:我有一个基础 class,它使用大量服务和子 classes(大约 40 个子 class)和我不想在所有 subclass 构造函数中添加这些服务并将它们传递给 super()
但我仍然需要在所有 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);
}
}
再添加一项服务并在其中注入所有必需的服务。我们可以简单地在 sub class 中添加该服务,然后将其传递给 super.
中的父级@injectable()
export class ParentService {
constructor(type: string, private service1: Service1, private service2: Service2,private service3: Service3, private service4: Service4){}
executeService1(){
this.service1.method1();
}
}
export class parentTool {
constructor(private parentService: ParentService){}
}
export class ChildTool1 extends parentTool {
constructor(public parentService: ParentService) {
super("tool1", parentService);
}
}
export class ChildTool2 extends parentTool {
constructor(public parentService: ParentService) {
super("tool2", parentService);
}
}
我曾经遇到过同样的问题,所以我最终使用 injector
服务
这个静态 class 用于存储注入器服务的引用
export class AppInjector {
private static injector: Injector;
static setInjector(injector: Injector) {
AppInjector.injector = injector;
}
static getInjector(): Injector {
return AppInjector.injector;
}
}
在应用程序模块中我设置了 injoctor 服务
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)
在基础组件中
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 现在可以访问注入器注入的所有服务 class
export class ChildComponent extends BaseComponent {
constructor() {
super();
}
}
您可以使用全局注入器来防止在所有子 类 中注入所有服务。 在您的情况下,它将是这样的:
import {Injector} from '@angular/core';
//other imports
export class parentTool {
public service1: Service1
public service2: Service2
public service3: Service3
public service4: Service4
constructor(type: string,injector: Injector){
this.serviceInject1 = injector.get(Service1);
this.serviceInject2 = injector.get(Service2);
this.serviceInject3 = injector.get(Service3);
this.serviceInject4 = injector.get(Service4);
}
}
export class ChildTool1 extends parentTool {
constructor(injector: Injector) {
super(injector);
this.service1.someMethodCall()
}
}
export class ChildTool2 extends parentTool {
constructor(injector: Injector) {
super(injector);
this.service1.someMethodCall()
}
}