我正面臨着這樣的問題:我創建了具有處理多個具體提供者的能力的事件管理器,並且我正在努力解決依賴注入問題。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容器中,可以退換。但我不知道:(,怎麼能有人給我解釋一下我應該怎麼解決這個問題?
文件WH ich包含的代碼位於:https://github.com/sdudziak/js-app-kickstarter/blob/master/src/server/bootstrap.ts –