Angular 如何将依赖项反转原理应用于角度测量? 我们考虑下面的情景: 您在登录表单中有一个用于密码恢复的按钮,此操作将打开一个具有两个选项的模式:“使用短信恢复”和“使用电子邮件恢复”。根据所选选项,该表单将允许您输入文本以键入电子邮件或手机,以及发送恢复请求的按钮
在Angular中,您可以创建一个将所选方法作为参数的服务,并根据该参数执行恢复密码的操作。 但是,如果添加了更多的方法,则有必要添加更多的条件以发出正确的请求。 根据坚实的原则,你应该依靠抽象而不是细节,这就是为什么你可以做如下事情:Angular 如何将依赖项反转原理应用于角度测量? 我们考虑下面的情景: 您在登录表单中有一个用于密码恢复的按钮,此操作将打开一个具有两个选项的模式:“使用短信恢复”和“使用电子邮件恢复”。根据所选选项,该表单将允许您输入文本以键入电子邮件或手机,以及发送恢复请求的按钮,angular,oop,solid-principles,dependency-inversion,angular-dependency-injection,Angular,Oop,Solid Principles,Dependency Inversion,Angular Dependency Injection,在Angular中,您可以创建一个将所选方法作为参数的服务,并根据该参数执行恢复密码的操作。 但是,如果添加了更多的方法,则有必要添加更多的条件以发出正确的请求。 根据坚实的原则,你应该依靠抽象而不是细节,这就是为什么你可以做如下事情: 导出接口恢复存储{ recoveryPassword(userId:string):void; } @可注射() 导出类SMSRepositoryService实现RecoveryRepository{ recoveryPassword(userId:strin
导出接口恢复存储{
recoveryPassword(userId:string):void;
}
@可注射()
导出类SMSRepositoryService实现RecoveryRepository{
recoveryPassword(userId:string):无效{
//sms实现
}
}
@可注射()
导出类EmailRepositoryService实现RecoveryRepository{
recoveryPassword(userId:string):无效{
//电子邮件实现
}
}
@可注射()
导出类OtherRepositoryService实现RecoveryRepository{
recoveryPassword(userId:string):无效{
//任何其他实施
}
}
和组件:
@组件({
选择器:“应用程序模式恢复”,
templateUrl:“./modal recovery.component.html”
})
导出类ModalRecoveryComponent{
建造师(
private _formBuilder:formBuilder,
私人recoveryRepository:recoveryRepository
) {
/*
.
.
使用FormBuilder的模态表单定义
.
.
*/
}
公共恢复(){
}
}
然后,为了使用SMS实现,我应该在组件中定义一个提供者:
@组件({
选择器:“应用程序模式恢复”,
templateUrl:'./modal recovery.component.html',
提供程序:[{提供:RecoveryRepository,useClass:SMSRepositoryService}]
})
或电邮:
@组件({
选择器:“应用程序模式恢复”,
templateUrl:'./modal recovery.component.html',
提供程序:[{提供:RecoveryRepository,useClass:EmailRepositoryService}]
})
然后调用该方法:this.recoveryRepository.recoveryPassword()代码>
但是,如果表单中的恢复方法值是动态的,那么如何根据用户选择的是sms还是电子邮件选项更改存储库实例
一个简单的选项是在构造函数中注入服务:
构造函数(
private _formBuilder:formBuilder,
private\u emailRepositoryService:emailRepositoryService,
专用存储服务:SMSRepositoryService
) {
}
公共恢复(){
如果(选项=='SMS'){
此.u SMSRepositoryService.recoveryPassword(idUser);
}否则如果(选项=='EMAIL'){
此.u emailRepositoryService.recoveryPassword(idUser);
}
}
但它与坚实的原则相违背,而且如果我们想到一个更复杂的场景,我们可能不得不更改组件中的许多内容。然后可以有一种工厂,负责根据所选选项更改实例,并使用这个.recoveryRepository.recoveryPassword(userId)为了只依赖抽象类,您只创建了一个公共抽象来联系后端,但这还不够,因为应用程序仍然需要了解具体的策略。设计应用程序,使其以一种不需要了解恢复策略的方式处理抽象。例如,RecoveryMethod
可能知道如何在UI上显示自己,并在选中时创建自己的对话框。