我有一个单一存储库,其中包含多个应用程序以及一些共享库。我想做的是为应用程序中的某些页面实现
authGuard
,但是我遇到的问题是,在路由器的上下文中,我的 AuthService
没有提供程序。
这是因为
AuthService
的依赖关系如下所示:
AuthService -> FirebaseAuthService -> FirebaseAppService -> EnvironmentService
最重要的是,我试图防止服务和模块被不必要地初始化。因此,只有当我尝试导航到需要身份验证的页面,或者我位于身份验证页面时(理想情况下,我会有一些不需要身份验证的信息页面),才应初始化
AuthService
。
尝试将我的防护包裹在
runInInjectionContext
中似乎会让事情变得更糟,因为我不仅不能使用 NgModule
类型作为 Injector
参数的值,而且还可以以满足的方式编写第二个参数的函数CanMatchFn
规格使得错误更多。
由于应用程序环境的初始化过程,我真的无法在“root”中提供
AuthService
。
您可以使用可选的注入:
export class AuthGuard {
constructor(@Optional() private authService: AuthService) {}
}
或
export function authGuard(): CanActivateFn {
return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
const authService = inject(AuthService, { optional: true });
...
};
}