Javascript 安格拉尔2号,工厂警卫可以吗?

Javascript 安格拉尔2号,工厂警卫可以吗?,javascript,angular,angular2-routing,angular2-services,angular-guards,Javascript,Angular,Angular2 Routing,Angular2 Services,Angular Guards,我对我的网站非常信任,因此为了确保安全路线,我建立了下一个守卫: export class TrustGuard implements CanActivate { constructor(private router: Router) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { return /*Check if user ha

我对我的网站非常信任,因此为了确保安全路线,我建立了下一个守卫:

export class TrustGuard implements CanActivate {
    constructor(private router: Router) {
    }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        return /*Check if user has the trust or not*/;
    }
}
因此,在路由中,我可以添加像
canActivate:[TrustGuard]

问题是我有太多的信任,因此我需要为每个信任建立一个防护。所以我试图建立一个防护工厂,以避免实现太多类似的防护

我的目标是找到一条像这样的路线
canActivate:[FactoryTrustGuard(Trust.seeDashboard)]


这可能吗?

这可能会给AOT带来问题,因为路由定义应该是静态的

防护装置可以干燥,以消除大多数样板代码:

export abstract class TrustGuard  {
    protected abstract trust: string;

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        /* check against this.trust */
    }
}

export class FooTrustGuard extends TrustGuard {
    protected trust = Trust.foo;
}
如果有数十个类似的防护装置,则可以将其设置为单个防护装置,并通过路由数据传递角色:

export class TrustGuard  {
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
        const trust = route.data['trust'];
        if (trust in Trust) {
          ...
        } else {
          throw ...;
        }
    }
}
像这样使用它

{ route: ..., canActivate: [TrustGuard], data: { trust: Trust.seeDashboard } }