1

私はこの種の問題に直面しています。私は、いくつかの具体的なプロバイダを扱うことができるイベントマネージャを作成していますが、ここで依存性注入の問題に苦しんでいます。TypeScript InversifyJS:非同期バインディング

私が使用しています:

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である私を記録します: [email protected][email protected][email protected][email protected]

はコードでそれを見ることができます。しかし... は、私は、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; 
    } 

    ... 
} 

だから私の問題は、私は必要なすべてのオブジェクトがInversifyJSコンテナに適切に保存され、返すことができ まで、initメソッドを呼び出すことで待たなければならないということです。しかし、私はどのように:(知らない。誰かがどのように私はこの問題を解決する必要があります私を説明できますか?

+0

ファイルWH ichには以下のコードが含まれています:https://github.com/sdudziak/js-app-kickstarter/blob/master/src/server/bootstrap.ts –

答えて

1

[OK]を、私はそれを解決しました。

問題は、私が上で考えていた全く別の場所にありました始まる。 だから... ...をMultipleProvidersEventManagerクラスにinit方法で、forEachは、呼び出し元のコンテキストを失うことだった。bindを追加しても問題がsoved ..

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

... anwserです。

関連する問題