В моем проекте Angular я использую AWS Amplify для обработки аутентификации. Теперь я хочу настроить его для управления токенами с помощью файлов cookie.
Прочитав документацию, я обнаружил, что мне нужно предоставить мое собственное хранилище для Amplify в main.ts.
Итак, я установил 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?
Спасибо за вашу помощь.





Что ж, main.ts - это точка входа для приложения Angular. Здесь мы не можем запрашивать экземпляры сервисов или внедрять их, потому что мы за пределами приложения Angular. Похоже, что объект Storage также полностью отделен от приложения Angular, поэтому любое внедрение зависимостей, которое вам нужно, придется делать самому.
Также обратите внимание: хотя я не могу найти какой-либо явной документации по этому поводу, Amazon пример этого класса Storage имеет все свои свойства как статические, поэтому я не уверен, ожидает ли конфигурация экземпляра класса вообще.
У меня была одна мысль - захватить APP_INITIALIZER, чтобы получить токены DI при первой загрузке приложения. Однако я не знаком с Amplify, поэтому я не знаю, что когда нужно настроить, поэтому это может сработать, а может и не сработать:
App.module.ts
providers: [
{
provide: APP_INITIALIZER,
useFactory: amplifyConfigFactory,
deps: [CookieService],
multi: true
}
]
ampifyConfigFactory.factory.ts
export function amplifyConfigFactory(cookieService: CookieService) {
Amplify.configure({
// ....
storage: new MyStorage(cookieService)
});
return () => Promise.resolve(); // factories must return a Promise
}
Итак, выше наши записи deps создаются и вводятся в фабрику по порядку, и мы можем создать MyStorage с cookieService из инжектора.
Опять же, если свойства MyStorage должны быть статическими, здесь вам понадобится другое решение. Мне кажется, что MyStorage не должен быть чем-то известным приложению Angular, но в зависимости от того, нужно ли настраивать Amblify до перехвата APP_INITIALIZER, это может сработать.