1

我正面临这种问题:我正在创建能够处理多个具体提供程序的事件管理器,并且我在这里遇到了依赖注入问题。

我正在使用: 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,这会使整个应用程序崩溃。但是......当我禁用kernel.getAll(...)from init 时,我收到的正是我所期望的:

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 容器中并且可以返回。但我不知道如何:(。有人可以解释一下我应该如何解决这个问题吗?

4

1 回答 1

1

好的,我已经解决了。

问题出在我一开始所想的完全不同的地方。所以......在方法MultipleProvidersEventManager类中,失去了调用者的上下文。添加解决了问题..initforEachbind

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

...是答案。

于 2016-11-23T21:00:56.570 回答