Внедрить сервис с конструктором в main.ts - PullRequest
0 голосов
/ 11 декабря 2018

В своем проекте Angular я использую AWS Amplify для обработки моей аутентификации.Теперь я хочу настроить его для управления токенами с файлами cookie.

После прочтения документации я обнаружил, что мне нужно предоставить свое собственное хранилище для усиления в main.ts. * 1006.*

Итак, я установил 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 голосов
/ 11 декабря 2018

Ну, 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 из Injector.

Опять же, если свойства в MyStorage должны быть статическими, вам понадобится другое решение здесь.Мне кажется, что MyStorage не должно быть чем-то известным для приложения Angular, но в зависимости от того, нужно ли сконфигурировать Amblify до хука APP_INITIALIZER, это может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...