让我们考虑以下场景:您在登录表单中有一个用于密码恢复的按钮,此操作会打开一个带有两个选项的模式:“通过 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) 并仅依赖于抽象类