0

我一直在寻找 TSyringe 是否有可能注入所有实现某个接口(或从抽象类扩展)的类,如下所示:

@injectable()
export interface IService {
    foo(): void;
}

@injectable()
export class Service1 implements IService {
    foo() { console.out("bar"); }
}

@injectable()
export class Service2 implements IService {
    foo() { console.out("baz"); }
}

export class CollectorService {
    constructor(
        @inject('Service')
        services: IService[]
    ) {
        services.forEach(s => s.foo());
    }
}

我一个月前才开始使用 TSyringe,所以我对所有功能都不熟悉,也不知道如何在 DI 容器中注册这种依赖项(如果可以实现我的建议)。我正在尝试模仿 Spring@Autowire注释。

4

2 回答 2

1

我不知道这是否是最好的解决方案,但我可以通过以下方式实现多次注入:

import {
  injectable, injectAll, registry, container,
} from 'tsyringe';

interface ValueClass {
  value: string;

  sayMyValue(): void;
}

@injectable()
@registry([{ token: 'ValueClass', useClass: ValueClass1 }])
class ValueClass1 implements ValueClass {
  sayMyValue(): void {
    console.log('ValueClass1');
  }

  value: string = 'value1';
}

@injectable()
@registry([{ token: 'ValueClass', useClass: ValueClass2 }])
class ValueClass2 implements ValueClass {
  value: string;

  sayMyValue(): void {
    console.log('ValueClass2');
  }
}

@injectable()
export class AppClass {
  constructor(
    @injectAll('ValueClass')
    private valueClasses: ValueClass[],
  ) { }

  run() {
    this.valueClasses
      .forEach((valueClass: ValueClass) => { valueClass.sayMyValue(); });
  }
}

const v = container.resolve(AppClass);
v.run();
于 2021-08-24T18:26:31.730 回答
0

我无法像在Aníbal Deboni Neto asnwerregistry中那样让每个类工作,但是使用代理类来放置所有对我有用的注册表。我还使用了 a这样我就没有任何魔术字符串。Symbol

interface IBar {}

@injectable()
class Foo implements IBar {}
@injectable()
class Baz implements IBar {}

@registry([
  {token: Bar.token, useToken: Foo},
  {token: Bar.token, useToken: Baz}
])
abstract class Bar {
  static readonly token = Symbol("IBar");
}

@injectable()
class User{
  constructor(@injectAll(Bar.token) private bars: IBar[]) {
  }
}

const bars: IBar[] = container.resolveAll<IBar>(Bar.token);
const user: User = container.resolve(User);

来源:https ://github.com/microsoft/tsyringe#register

于 2021-09-27T14:45:07.370 回答