vovaspace / brandi

The dependency injection container powered by TypeScript.
https://brandi.js.org
ISC License
193 stars 12 forks source link

Use injected() function with AsyncFactory? #41

Open JSchaenzle opened 10 months ago

JSchaenzle commented 10 months ago

I have a singleton class that is being injected into other classes using the injected(...) syntax. The class is called Exchange. I need to add an async initializer to that class. (want to set up a websocket before the class is used) I'm trying to do so by creating a Factory but I'm running into a roadblock. Can I still used injected() when using an async Factory?

I have tokens defined as follows:

    exchange: token<Exchange>('Exchange'),
    exchangeFactory: token<AsyncFactory<Exchange>>('Exchange Factory'),

and container bindings set up like this,

    .bind(TOKENS.exchange)
    .toInstance(ExchangeAlpaca)
    .inSingletonScope();

container
    .bind(TOKENS.exchangeFactory)
    .toFactory(async () => {
        let e = container.get(TOKENS.exchange);
        await e.init();
        return e;
    });
class SomeClass {
  constructor(private e: Exchange){}
}
injected(SomeClass, TOKENS.exchangeFactory.optional) // <- this doesn't work
injected(SomeClass, TOKENS.exchange.optional) // <- this works but factory doesn't get used.