Внедрить сервис с конструктором в main.ts

В моем проекте 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?

Спасибо за вашу помощь.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
1 807
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, 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, это может сработать.

Другие вопросы по теме