我正面临着这样的问题:我正在创建具有处理几个具体提供者的能力的事件管理器,并且在这里我正在努力解决依赖注入问题。
我用:Typescript@2.0.10,node@7.0.0,inversify@2.0.1,inversify-binding-decorators@2.0.0
让我们在代码中看到:
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容器中并可以返回。但我不知道怎么做:有人能解释一下我该怎么解决这个问题吗?
发布于 2016-11-23 21:00:56
好吧,我已经解决了。
问题就在我刚开始思考的完全不同的地方。所以..。在init方法上的init类中,forEach正在释放调用方的上下文。添加bind解决了这个问题。
forEach(providers, this.registerProvider.bind(this));..。是个无名氏。
https://stackoverflow.com/questions/40751249
复制相似问题