在我的Angular项目中,我使用AWS Amplify来处理我的身份验证。现在,我想将其配置为使用cookies管理令牌。
在阅读文档之后,我发现我需要在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
}
});
Problem:new MyStorage()
需要一个cookieService in参数,但似乎无法在main.ts
中添加构造函数。
Question:如何在main.ts
中传递服务?
谢谢你的帮助。
发布于 2018-12-11 06:32:46
main.ts
是Angular应用程序的入口点。在这里,我们无法查询服务实例或注入它们,因为我们在Angular应用程序之外。看起来Storage
对象也与Angular应用程序完全解耦了,所以你要注入的任何依赖项都必须自己做。
同样值得注意的是:虽然我找不到任何关于这方面的显式文档,但亚马逊这个存储类的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
条目被实例化并按顺序注入到工厂中,我们可以使用来自注入器的cookieService
创建一个MyStorage
。
同样,如果MyStorage上的属性必须是静态的,那么这里需要一个不同的解决方案。在我看来,Angular应用程序不应该知道MyStorage
,但这取决于是否需要在APP_INITIALIZER
钩子之前配置Amblify,这是可行的。
https://stackoverflow.com/questions/53714308
复制相似问题