Как привязать экземпляр к инверсии контейнера - PullRequest
1 голос
/ 07 августа 2020

Я использую inversify с inversify-express-utils.

У меня обычная настройка inversify/express.

  • Контроллер
    • Сервис
      • Модуль
        • Модуль B

B module - это класс, который выглядит как это:

import { injectable } from 'inversify';
import SpellCorrector from 'spelling-corrector';

@injectable()
export class SpellCorrectorFactory {
  private corrector: any;

  constructor() {
    this.corrector = new SpellCorrector();
    this.corrector.loadDictionary();
  }

  public correct = (text: string): string => this.corrector.correct(text);
}

Теперь проблема в том, что, как вы можете видеть в конструкторе, у меня есть эта строка кода:

this.corrector.loadDictionary()

Эта строка занимает секунду для выполнения . Таким образом, в основном кажется, что фактическое создание экземпляра происходит, когда я @inject service B для обслуживания A Итак, каждый раз, когда я делаю запрос, выполняется конструктор SpellCorrectorFactory, поэтому запрос занимает более 1000 мс вместо этого менее 100 мс.

Как я могу привязать этот класс к инверсии, чтобы во время привязки был создан экземпляр класса, а в A module у меня был доступ к экземпляру, который был создан при запуске приложения, а не когда я отправить запрос по пути express?

Заранее спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Хорошо, на случай, если кто-то заглянет на эту страницу в поисках ответа.

Решение очень простое:

container
  .bind<SpellCorrectorFactory>(TYPES.SpellCorrector)
  .to(SpellCorrectorFactory)
  .inSingletonScope();

Это вызывает конструктор SpellCorrectorFactory немедленно и возвращает экземпляр. Таким образом, всякий раз, когда вы вводите результат этой привязки, у вас есть прямой доступ к экземпляру и его функциям.

...