0

让我们考虑以下场景:您在登录表单中有一个用于密码恢复的按钮,此操作会打开一个带有两个选项的模式:“通过 SMS 恢复”和“通过电子邮件恢复”,根据选择的选项,表单启用输入文本您输入电子邮件或手机和按钮以发送恢复请求。

在 Angular 中,您可以创建一个服务,该服务将所选方法作为参数,并根据该参数执行恢复密码的操作。但是,如果添加更多方法,则需要添加更多条件才能发出正确的请求。根据 SOLID 原则,您应该依赖抽象而不是细节,这就是为什么您可以执行以下操作:

export interface RecoveryRepository {
  recoveryPassword(userId: string): void;
}

@Injectable()
export class SMSRepositoryService implements RecoveryRepository {
  recoveryPassword(userId: string): void{
    // sms implementation
  }
}

@Injectable()
export class EmailRepositoryService implements RecoveryRepository {
  recoveryPassword(userId: string): void{
    // email implementation
  }
}

@Injectable()
export class OtherRepositoryService implements RecoveryRepository {
  recoveryPassword(userId: string): void{
    // any other implementation
  }
}

和组件:

@Component({
  selector: 'app-modal-recovery',
  templateUrl: './modal-recovery.component.html'
})
export class ModalRecoveryComponent {
  constructor(
    private _formBuilder: FormBuilder,
    private recoveryRepository: RecoveryRepository
  ) {
      /*
       .
       .
       modal form definition with FormBuilder
       .
       .
      */

  }

  public recovery() {
    
  }
}

然后为了使用 SMS 实现,我应该在组件中定义一个提供程序:

@Component({
  selector: 'app-modal-recovery',
  templateUrl: './modal-recovery.component.html',
  providers: [{ provide: RecoveryRepository, useClass: SMSRepositoryService }]
})

或电子邮件:

@Component({
  selector: 'app-modal-recovery',
  templateUrl: './modal-recovery.component.html',
  providers: [{ provide: RecoveryRepository, useClass: EmailRepositoryService }]
})

然后调用该方法:this.recoveryRepository.recoveryPassword();

但是,如果表单中的恢复方法值是动态的,那么如何根据用户选择短信还是电子邮件选项来更改存储库实例?

一个简单的选择是在构造函数中注入服务:

constructor(
    private _formBuilder: FormBuilder,
    private _emailRepositoryService:EmailRepositoryService,
    private _SMSRepositoryService:SMSRepositoryService
  ) {
}

public recovery() {
    if(option==='SMS'){
      this._SMSRepositoryService.recoveryPassword(idUser);
    }else if(option==='EMAIL'){
      this._emailRepositoryService.recoveryPassword(idUser);
    }
}

但它违反了 SOLID 原则,如果我们想到更复杂的场景,我们可能必须更改组件中的许多内容。然后可能有一种工厂负责根据所选选项更改实例并使用 this.recoveryRepository.recoveryPassword(userId) 并仅依赖于抽象类

4

0 回答 0