1

我正面臨着這樣的問題:我創建了具有處理多個具體提供者的能力的事件管理器,並且我正在努力解決依賴注入問題。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,其崩潰的整個應用程序。但是...... 當我禁用由init的kernel.getAll(...),然後我收到正是我期望:

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

給我:MultipleProvidersEventManager { providers: {} }。 init方法是通過本身非常簡單,包含:

@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; 
    } 

    ... 
} 

所以我的問題是,我不得不等待與調用init方法,直到 所有需要的對象都得到恰當存放InversifyJS容器中,可以退換。但我不知道:(,怎麼能有人給我解釋一下我應該怎麼解決這個問題?

+0

文件WH 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。