我一直在寻找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注解。
发布于 2021-08-24 18:26:32
我不知道这是不是最好的解决方案,但我可以用下面的代码实现多次注入:
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-09-27 14:45:07
我不能让每个类的registry像在Aníbal Deboni Neto asnwer中那样工作,但是使用代理类来放置所有的注册表对我来说很有效。我还使用了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://stackoverflow.com/questions/68911553
复制相似问题