thiagobustamante / typescript-ioc

A Lightweight annotation-based dependency injection container for typescript.
MIT License
526 stars 64 forks source link

Async Factory #64

Open davidbayo10 opened 4 years ago

davidbayo10 commented 4 years ago

Hi all! I want to perform this factory class behaviour, but when I call new S(), a promise is returned. Do I do something wrong? May this feature is not present for being used as factory?

const factory: ObjectFactory = async () => S.getInstance();

@Factory(factory)
export class S {

  private static _instance: S;

  static async getInstance(): Promise<S> {
    if (!this._instance) {
      this._instance = new S();

      await this._instance.createClient();
    }

    return this._instance;
  }

  async createClient(): Promise<void> {
    this._client = await createClientAsync('url');
  }

}

Thank you all in advance!

InsOpDe commented 4 years ago

Just had the same problem. You'll get a Promise if you use it like this. I solved it like this

const messenger = await Messenger.create(uri, serviceName, ttl)
Container
        .bind(Messenger)
        .factory(() => messenger)
        .scope(Scope.Singleton)

Works for me because im in a async function while using await

TheOnlyMrFlow commented 3 years ago

Any update on this ?

davidbayo10 commented 3 years ago

Just had the same problem. You'll get a Promise if you use it like this. I solved it like this

const messenger = await Messenger.create(uri, serviceName, ttl)
Container
      .bind(Messenger)
      .factory(() => messenger)
      .scope(Scope.Singleton)

Works for me because im in a async function while using await

I prefer to use @Inject into property classes

davidbayo10 commented 3 years ago

Any update on this ?

I think this repo is not maintained...

tripodsgames commented 3 years ago

I'm using async-injection instead of this one.