我想在我的应用程序中创建一个身份验证装饰器。
用法示例应该很简单
@RequireAuthentication()
@HostListener('click', ['$event']) onClick(event: Event) {
// ...
}
据我所知装饰器只能是函数,所以在其他一些文件中我计划有
export function RequireAuthentication() {
if (!userService.isAuthenticated) {
navigationService.goToLogin();
return;
}
}
对我来说,问题是在这种情况下如何正确初始化 userService 和 navigationService,因为这些服务包含用于查找用户是否经过身份验证并显示登录屏幕的所有逻辑。
我已经尝试过:
- 使用带有构造函数的类进行服务初始化,但嵌套方法不能用作装饰器
- 要使用 Injectable 类创建服务,我需要创建此类的实例,同样的问题。
- 使用 ModuleWithProviders 方法隐藏身份验证实现并仅公开装饰器,但不确定这是否是正确的方法。
任何提示都会有帮助。可能是我错过了一些基本的东西,因为我不是经验丰富的角度开发人员,或者还有另一种方法来解决这个问题。
正如中所解释的这个答案 https://stackoverflow.com/a/48875749/3731501,框架惯用的解决方案是公开injector
类实例属性,因此可以在装饰器内部访问它。的存在injector
属性也可以通过接口来保护。
由于属性装饰器运行一次并且可以访问类原型但不能访问实例,因此有必要修补ngOnOnit
方法并检索修补方法内的所有必要服务this.injector.get()
.
另一种方法是将全局注入器暴露给某个对象,如所解释的here https://stackoverflow.com/questions/39409328/storing-injector-instance-for-use-in-components。这不是惯用的解决方案,而是一种会导致某些限制和负面后果的黑客行为。很难推荐在生产中使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)