首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TSyringe注入实现某些接口的所有类

TSyringe注入实现某些接口的所有类
EN

Stack Overflow用户
提问于 2021-08-24 17:17:24
回答 2查看 351关注 0票数 0

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

代码语言:javascript
运行
复制
@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注解。

EN

回答 2

Stack Overflow用户

发布于 2021-08-24 18:26:32

我不知道这是不是最好的解决方案,但我可以用下面的代码实现多次注入:

代码语言:javascript
运行
复制
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();
票数 1
EN

Stack Overflow用户

发布于 2021-09-27 14:45:07

我不能让每个类的registry像在Aníbal Deboni Neto asnwer中那样工作,但是使用代理类来放置所有的注册表对我来说很有效。我还使用了Symbol,所以我没有任何神奇的字符串。

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68911553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档