TypeScript InversifyJS:异步绑定
TypeScript InversifyJS: asynchronous binding
我遇到了这种问题:我正在创建能够处理多个具体提供程序的事件管理器,并且我正在努力解决这里的依赖注入问题。
我正在使用:
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 容器中,并且可以返回。但我不知道如何:(。有人可以解释一下我应该如何解决这个问题吗?
好的,我已经解决了
问题出在我一开始想的完全不同的地方。
所以...在 MultipleProvidersEventManager
class 的 init
方法中,forEach
失去了调用者的上下文。添加 bind
解决了问题..
forEach(providers, this.registerProvider.bind(this));
...是答案。
我遇到了这种问题:我正在创建能够处理多个具体提供程序的事件管理器,并且我正在努力解决这里的依赖注入问题。
我正在使用:
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 容器中,并且可以返回。但我不知道如何:(。有人可以解释一下我应该如何解决这个问题吗?
好的,我已经解决了
问题出在我一开始想的完全不同的地方。
所以...在 MultipleProvidersEventManager
class 的 init
方法中,forEach
失去了调用者的上下文。添加 bind
解决了问题..
forEach(providers, this.registerProvider.bind(this));
...是答案。