1

Я столкнулся с такой проблемой: я создаю Event Manager с возможностью обработки нескольких конкретных поставщиков, и я борюсь с проблемой инъекций зависимостей здесь.TypeScript InversifyJS: асинхронное связывание

Я использую: [email protected], [email protected], [email protected], [email protected]

Давайте посмотрим, что в коде:

const socketIO: SocketIO.Server = io.listen(instance); 
kernel.bind<SocketIO.Server>(TYPES.SocketIO).toConstantValue(socketIO); 

const eventManager: IEventManager = kernel.get<IEventManager>(TYPES.IEventManager); 
eventManager.init(kernel.getAll<IEventManagerProvider>(TYPES.IEventManagerProvider)); 
console.log(eventManager); 

И консоль регистрирует меня, что менеджер событий undefined, который разбивает все приложение. Но ... Когда я отключить kernel.getAll(...) от инициализации, то я получаю только то, что я ожидал:

const eventManager: IEventManager = kernel.get<IEventManager>(TYPES.IEventManager); 
eventManager.init([]); 
console.log(eventManager); 

дает мне: MultipleProvidersEventManager { providers: {} }. Метод инициализации очень прост сам по себе и содержит:

@provideSingleton(TYPES.IEventManager) 
class MultipleProvidersEventManager { 

    ... 

    public init(providers: IEventManagerProvider[]): void { 
     forEach(providers, this.registerProvider); 
    } 

    public registerProvider(provider: IEventManagerProvider): void { 
     if (this.providers[provider.type()]) { 
      throw new Error('Event Manager provider already registered'); 
     } 
     console.log('Registered ' + provider.type() + ' event manager provider'); 
     this.providers[provider.type()] = provider; 
    } 

    ... 
} 

Так что моя проблема в том, что я должен ждать с не вызывая метод инициализации до всех необходимых объекты хранятся надлежащим образом в InversifyJS контейнере и могут быть возвращены. Но я не знаю, как :(. Может кто-нибудь объяснить мне, как я должен решить эту проблему?

+0

файл белых ich содержит код: https://github.com/sdudziak/js-app-kickstarter/blob/master/src/server/bootstrap.ts –

ответ

1

Хорошо, я решить.

Проблема была в совершенно другом месте, я думал на начало. Так что ... в MultipleProvidersEventManager классе по init методы, forEach теряла контекст вызывающего абонента. Добавление bind soved проблемы ..

forEach(providers, this.registerProvider.bind(this)); 

... это anwser.

Смежные вопросы