在main.ts中注入带有构造函数的服务

时间:2018-12-10 21:59:18

标签: angular amazon-cognito aws-amplify

在Angular项目中,我正在使用AWS Amplify处理身份验证。 现在,我想将其配置为使用cookie管理令牌。

阅读文档后,我发现需要在main.ts中提供my own storage to Amplify

因此,我安装了ngx-cookie并开始在库方法和AWS Amplify签名之间进行映射,如下所示:

main.ts

class MyStorage {

  constructor(private cookieService: CookieService) { }

  setItem(key: string, value: string) {
    this.cookieService.put(key, value);
  }

  getItem(key: string): string {
    return this.cookieService.get(key);
  }

}

Amplify.configure({
  ...amplify,
  Auth: {
    oauth: oauth,
    cookieStorage: {
      domain: 'localhost'
    },
    storage: new MyStorage(), <--- expect a cookieService here
  }
});

问题new MyStorage()期望在参数中使用cookieService,并且似乎无法在main.ts中添加构造函数。

问题:如何在main.ts中传递服务?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好吧,main.ts是Angular应用程序的入口点。在这里,由于我们不在Angular应用程序之外,因此无法查询服务实例或将其注入。看来Storage对象也已与Angular应用程序完全分离,因此您必须自己进行任何依赖注入。

还要注意:虽然我找不到任何明确的文档,但是Amazon的此Storage类的example的所有属性均为静态,因此我不确定配置是否期望实例完全是一个班级。

我曾经想过要劫持APP_INITIALIZER以便在应用程序首次引导时获取DI令牌。但是,我对Amplify并不熟悉,因此我不知道何时需要配置,因此这可能会或可能不会起作用:

App.module.ts

providers: [
  {
    provide: APP_INITIALIZER,
    useFactory: amplifyConfigFactory,
    deps: [CookieService],
    multi: true
  }
]

amplifyConfigFactory.factory.ts

export function amplifyConfigFactory(cookieService: CookieService) {
  Amplify.configure({
    // ....
    storage: new MyStorage(cookieService)
  });

  return () => Promise.resolve(); // factories must return a Promise
}

因此,我们的deps条目上方被实例化并按顺序注入工厂,我们可以使用Injector中的MyStorage创建一个cookieService

同样,如果MyStorage上的属性必须是静态的,那么您将需要一个不同的解决方案。在我看来,MyStorage并不是Angular应用程序应该知道的,但是取决于是否需要在APP_INITIALIZER钩子之前配置Amblify,这可能有效。