Angular:注入抽象依赖

问题描述

我有一个名为EntityService的“抽象”服务。此服务专用于其他服务,例如ExerciseService,FooService等。其他组件:DeleteModal具有EntityService作为依赖项。为了创建此模式,我需要指定依赖关系解析,但始终会出现以下错误:

ERROR NullInjectorError: R3InjectorError(AppModule)[EntityService -> EntityService -> EntityService]: 
  NullInjectorError: No provider for EntityService!
export class ExerciseDetailComponent {

  constructor(public modalService: NgbModal) { }

  delete() {
    const customInjector = Injector.create({ providers: [{provide: EntityDeleteModalComponent,deps: [{provide: EntityService,useClass: ExerciseService},AlertService]}] });
    const modalRef = this.modalService.open(EntityDeleteModalComponent,{ injector: customInjector });
    modalRef.componentInstance.name = 'DeleteModalExercise';
  }

}

export class EntityDeleteModalComponent {

  loading = false;
  @Input() id: string;
  @Output('action') eventEmitter = new EventEmitter();

  constructor(
    public entityService: EntityService<Entity>,public alertService: AlertService
  ) {}

  delete() {
    const subscription = this.entityService.delete(this.id)
      .subscribe({
        next: data => {
          this.loading = false;
          subscription.unsubscribe();
          this.eventEmitter.emit('deleted');
        },error: error => {
          this.loading = false;
          subscription.unsubscribe();
          this.alertService.error(error.message);
          this.eventEmitter.emit('error');
        }
    });
  }

  export class EntityService<T extends Entity> {
    // Code omitted
  }

  @Injectable({
     providedIn: 'root'
  })
  export class ExerciseService extends EntityService<Exercise> {
     // Code omitted
  }
}

此外,我尝试使用customUseFactory,但结果相同:

export class ExerciseDetailComponent {

  @Input() exercise$: Observable<Exercise>;
  enableEdit = true;

  constructor(public modalService: NgbModal) { }

  delete() {
    const customUseFactory = (
      httpClient: HttpClient,alertService: AlertService
    ) => new EntityDeleteModalComponent(new ExerciseService(httpClient),alertService);

    const customInjector = Injector.create({ providers: [{ provide: EntityDeleteModalComponent,useFactory: customUseFactory,deps: [ExerciseService,AlertService] }]});
    console.log(customInjector);
    const modalRef = this.modalService.open(EntityDeleteModalComponent,{ injector: customInjector });
    modalRef.componentInstance.name = 'DeleteModalExercise';
  }

}

当依赖项为EntityService时,应如何声明喷油器以解析ExerciseService?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...